logo

分享路漫漫其修远兮-我这20年学过的编程技术日记总结

头像
程序员老兵
169阅读14评论
写这个帖子,是想做一个流水日记,把我这20年学过的软件开发相关的技术都回顾一下。同时,承前启后,把今后的学习经历也记录下来,对自己是一个鞭策。

根据我学习的深浅程度,可以区分为四个等级:

++浅学++ 浅学:学习过相关的概念,看过介绍资料,但是没有搞过实际案例。
++中学++ 中学:学习过,也有过小型应用案例,但是没有过大型企业级开发的项目案例。
++较深学++ 较深学:有过比较多的大型实际项目案例,应用比较熟练,但是对该技术的内在架构或者源码还不甚了解。

超深学:不仅有过实际案例,而且对该技术的内核很了解,可以说是学透了。

说来惭愧,捋了捋,基本上没有一门能达到“超深学”的程度,广而不精。这也是我的一个深层次的无奈吧,为生计奔波,哪有时间精力去深入钻研一门技术后的层峦叠嶂的内核呢,就算有,这门技术后来被淘汰了咋办,计算机技术发展太快了。

列个清单吧--------------

**编程语言**

1.PB(PowerBuild) 较深学。  
 说明:老古董,VC开发的数据库工具。1995-2005年左右流行,至今还有一些老程序员、老项目在用。我当年用它做过一些项目。

2.Delphi  较深学。   
 说明:老古董,基于Pascal语言的开发平台,1995-2010年左右一度流行,至今还有一些老程序员、老项目在用。我当年用它做过一些项目。

3.C# WinForm和WPF 较深学。   
 说明:老树新花。2002年左右诞生,2010年之后一度随着桌面软件的没落而失宠,但是近几年因为工业软件、Unity等的需要又有复兴的趋势。实际上,C#是一个比较庞杂的系统,开发桌面软件有WinForm体系和WPF体系,同时C# + Asp.NET可以用于开发Web,最新的又有.net core号称可以跨平台。最最新的微软近几年又推出了号称可以跨平台的Maui框架。
 至今还有一批程序员坚守.net阵营,不过人数不多。我从2011年开始使用C#,用它做过不少项目。

4.Asp 中学。
 说明:老古董,微软推出的最早的web开发服务器端语言,是Asp.NET的前身。

5.Asp.NET 较深学。
 说明:与IIS和C#语言配合,可以做Web一整套前后端体系,“服务器端控件”是它的最大特色。当年javaBean + jQuery开发速度较慢,而它的开发速度较快。最大的缺点是不能跨平台。我用Asp.NET做的项目有的至今仍在运行。

6.VB(Visual Basic) 中学。
 说明:VB6.0是我的,也是很多人的当年的入门级编程语言,以入门简单上手快著称,地位相当于今天的Python,当然它太封闭了,没有Python那海量的各种开发包。

7.VC(Visual C++) 中学。
 说明:VC++6.0是当年C++语言的一代经典。很多人用它开发出了当年各种著名的应用软件。VC基于微软的MFC类库。

8.java  中学 - 较深学。
 说明:java毫无疑问是当今编程界的主力军。究其原因,当然是因为其各种框架层出不穷,对多线程、高并发有较好的解决方案,从而为互联网大厂所喜。而互联网大厂是当今就业的主力军,大厂的爱好就是码农们的爱好。然后当2000年左右java刚刚在行业界暂露头角的时候,其远没有现在这样成熟,那会javaBean、EJB等等还是主流,前端也没有什么较好的解决方案。后来2005年开始逐步有了Struts、Spring、Hibernate,即所谓的“SSH”。那会很多人写简历求职,一张口就是“我会SSH”,再后来开始有了springMVC。时间过得好快,如今springClound微服务都已成主流了。
 我现在的状态是,可以用springboot开发普通项目,也开发了一些项目。但是对于java深层比如虚拟机调优啥的还没怎么仔细研究。

9.PHP 中学。
 说明:曾几何时,“PHP是最好的编程语言”这样的梗还能引得程序员们撕斗一番。但是这几年来,明显感觉到PHP不像前几年那么火热了。最明显的例子是,各大培训机构很少有培训PHP的了。其实从2000年以后PHP暂露头角开始,它就一直作为一种比较快速简单的web开发语言而存在,而且和MySQL结合紧密。另外PHP这些年也没有停止发展,有很多框架,比如大家熟知的ThinkPHP,Yii,以及笔者用过的iPHP,最新的流行框架是Lavarel。


10.Qt 较深学。
 说明:有两年忽然对Qt感兴趣,Qt是一种基于C++语言的跨平台控件包,后来发展成为一整套开发工具。另外Qt亦可在Python下使用(PyQt)。我学习Qt是因为其可以跨平台的桌面界面控件特性。不过我发现一个问题,学习Qt的同学大部分都是搞嵌入式的,嵌入式喜欢学习Qt,究其原因,可能是因为目前嵌入式的很多操作系统都是Linux的某种发行版,从而让Qt有了用武之地。不过和java虚拟机的“一次编译,到处运行”方式不同。Qt可是货真价实的编译型语言,所以它在Windows、Linux、Mac下面都要重新编译,也就是“一套代码,到处编译”。笔者曾经在Linux桌面版(比如优麒麟、深度)下面用Qt编译程序,结果发现麻烦得很,很多东西都要自己配。Linux不如Windows方便。


11.Python 浅学 - 中学。
 说明:笔者2008年左右在外企上班的时候,第一次听说了Python。从此后的十余年间,拜各种培训机构所赐,这个Python真的是鼎鼎大名、如雷贯耳。现在我们都知道Python上手快(其实上手快的语言有很多,比如VB),数学计算功能强大,各种开发包支持。但是老实说哈,Python确实功能很强大,不过这些培训机构的宣传有点过了,毕竟现在身边貌似真正全程使用Python的大型项目还不多,Python还没到可以笑傲江湖一览众山小的地步。而且Python语言的一些特点,比如弱类型、严格的缩进格式让笔者有点不适应。



**开发框架**

1.SpringBoot 中学 - 较深学

2.iPHP  中学-较深学

3.Vue  中学-较深学

4.ThinkPHP 中学

5.Extjs 浅学
  说明:Ext是2005-2010年左右移动端出现之前红极一时的前端胖客户端架构,功能很全面。学Ext比较搞笑,这个是在工作中用到了。于是买了一本《Ext深入浅出第2版》,打算好好研读。但是因为工作较忙一直没来得及看。结果没过几年,由于移动端兴起,Ext没落了。书也就没必要再看了。类似这种“还没来得及看便被淘汰”的东西这些年还有不少。只能感叹计算机领域日新月异。
     


**数据库**

1.MS SQL Server 较深学。

  说明:曾经红极一时,占据了60%数据库市场的统治级王者。35岁以上的程序员基本上没有不会用的。笔者从sql7.0,sql2000,sql2005一直到sql2016,但是自从以MySQL为代表的开源数据库逐渐走上历史舞台之后,便开始逐步没落。如今连笔者都在工作电脑上卸载了它,仅仅是在云服务器中保留, 

2.Oracle 较深学。
  说明:中国的企业、金融等高级领域数据库的绝对王者,至今仍然占据了大约50%的高端市场份额。笔者曾经参与过几个Oracle数据库的项目,最后一次参与的版本是Oracle11g。

3.MySQL 较深学。
  说明:2015年以后,随着移动端和互联网大厂的兴起,笔者日益发现以MySQL为主流的开源数据库越来越吃香,便果断决定转向MySQL。做了几个项目。曾经把SQ Server下的存储过程转化为MySQL的存储过程,相当于两种数据库脚本语言的转换。

4.PostgreSQL/华为高斯Gauss 中学-较深学。
  说明:最近几年,笔者发现,MySQL虽然仍然无人能撼动,但是PostgreSQL开始悄然崛起。正好笔者遇到一个项目,需要把SQL Server数据库转换为PostgreSQL数据库,便果断决定参与了,解决的还可以。另外笔者去年学习了一段时间的华为高斯Gauss数据库,其实Gauss就是PostgreSQL的某种发行版。

5.Sqlite 较深学。
  说明:笔者近几年无意中发现的一种类似于Access的单机文件数据库,使用简单方便,而且可以跨平台。但是Sqlite不支持存储过程。同时Sqlite有个问题就是没有登录密码,笔者至今没有找到比较好的解决方案。不知道其他朋友有没有。

6.InterBase 中学。
  说明:Interbase是宝兰(Borland)公司的产品,宝兰公司是啥公司呢?就是推出了上面提到的Delphi的公司,笔者甚至当时还作为代表去该公司北京总部去洽谈购买正版事宜。当然该公司现早已消失,几经转手,目前不知道卖给谁了。不过Pascal作为一种独特的语言,在计算机发展史上有着独特的地位。另外Delphi据说有个孪生兄弟叫Lazarus(拉扎鲁斯),可以在Linux下编译运行。

7.Access 中学。
  说明:Windows下的单机数据库。和Office结合得比较好。


**其他杂七杂八**

1.编译原理。 浅学。
  说明:笔者曾经跟着一本日本人写的书,做了一个以java语言开发的脚本语言。从中学到了词法分析、语法树、token等方面的知识。

2.剪映。  中学。

3.tableau。 浅学。 一种BI工具。

4.WeX5,BeX5。 中学。北京某公司开发的比较早期的非SaaS、可独立部署的低代码跨平台java开发工具。


唠唠叨叨,先说这么多吧,笔者的感觉是,软件编程开发这玩意,真的犹如佛经一般,恒河沙数,浩如烟海。各种门类博大精深。计算机其实并不是一个专业,而是一所大学,随便选其中一个专业,都能让你研究一辈子了。

学计算机,你自己没有一个书柜是不行的。
加载中…
精选评论
头像

刚接触这行就用的iis+sqlsever做的商城,所有的sql语句都被我当时主管要求写成存储过程。后来上线又说用linux系统,当时查了很多资料都没搞定linux下用sqlserver,然后重构整个项目换成mysql,累死人了

嗯嗯,sql server基本上就是倒在了闭源和不能跨平台上。微软的东西都是基于windowsAPI,所以很难跨平台,当然.net是基于.net framework。现在他们也开窍了,推出了.net core,号称跨平台,不过这玩意有人用过么?

头像
大概2010年以后,拜移动互联网崛起所赐,这些互联网大厂得到了海量的融资(而非实际盈利),动不动就是30k、50k的月薪,让广大程序员们很是心动。于是这些互联网大厂的各项标准就成了计算机行业界的金字标准,仿佛计算机世界只有这些了。

其实,并不是。计算机世界绝非只有互联网和移动互联网(虽然都是很重要的一部分)。中国以制造业立国,中国成百上千的制造业大中小工厂,他们也需要信息化,两化融合。以工业软件、企管软件为代表的toB端软件,同样是计算机世界重要的组成部分,

从特点上来说,互联网大厂的toC系统,特点是业务流程简单、但是并发量大。所以这些大厂热衷于找能把高并发之类的“原理和算法”玩得转的人才,大家想入职大厂就得去背各种各样的java考试教程。但是对于广大toB端软件来说,特点恰恰相反,并发量很小(你想一个工厂才有几个人),但是业务流程超级复杂。说得不客气一点,连那些互联网大厂都未必玩得转。

听到好多程序员说,商城类的软件是“业务最复杂的”。怎么说呢,所谓商城其实就是个进销存系统。这种难度在B端软件的世界里充其量只是入门级,工厂企业用到的ERP(企业资源计划)、BPM(企业流程再造)、MRP(物料需求计划)、MES(制造业执行系统)、PDM(产品数据管理)......您做个试试吧,您看看您能理解多少。

2007-2010年,我在一家电子厂,自己搞过一套MRP物料需求计划运算系统,运转得很好,采购部门每天依靠我这套软件的运算结果去指导采购原材料。我后来还打算把这套算法去申报一个发明专利,不过被告知纯软件的东西很难申请专利(可以软著)^_^
头像
[评论已删除]

CRUD?呵呵。冒昧问下哈,假如我这里有一个客户,想做一套车间生产管理系统。我现在只有他的地址和电话,我现在让你从过去现场调研开始,一步一步,最后项目验收回款。不知道您全过程能否干下来?您如何捕捉客户需求?如何建模?如何说服车间工人用你的软件?你的那些所谓算法和原理在这种实践中能起什么作用?你跟车间工人讲啥叫锁啥叫异步啥叫线程?

   而且您真的觉得所谓CRUD很简单吗?说个亲身案例吧。去年也就是2021年,一家机加工厂找到我,想做一个自定义标签打印系统。他们之前有一个基于斑马打印机的标签打印系统,用友给开发的。不过那个系统的标签样式是固定写死的,一旦更换就得重新找用友修改,实在是觉得不方便。于是他们想让我开发一个能够自定义标签样式的打印系统。这个系统要求可以自定义数据模板,可以自定义标签样式,所谓自定义就可以随意添加和拖拽显示控件。其实就是一个小型的自定义报表系统(国内诸如重庆帆软、西安葡萄城之类的公司专门干这个)。
  这个系统都不用联网,单机桌面软件即可, 因为就一个人用。这个软件大概也属于您所谓的CURD软件了吧。冒昧问下哈,对于这样的软件,您的“系统可观测性,还有微服务,还有分布式事务”这些能起什么作用?您的所谓“算法和原理”又能起什么作用?人家就要一个单机桌面版,您打算怎么给他“分布式事务”呢?
头像
   我个人是一个“实践派”程序员,我承认我理论知识可能不如某些大咖丰富。不过怎么说呢,一名程序员熟悉各种原理和算法,这是好事。不过如果觉得因此自己就比别人高一等,这就值得商榷了。现在这么多编程语言、数据库和开源架构,哪个是您发明的呢?您如果是尤雨溪本尊,那我上面这些话收回。您只不过会一点java调优,会分布式,会k8s,知道数据库有几种锁,会分库分表(我现在都不明白所谓分库分表不是数据库设计最基本的常识么,怎么成了一门显学),会个贪心算法,知道B+树,知道回字有几种写法。但是说白了,您本质上也是在使用别人发明的语言、框架、算法,您可能去爬帮助文档爬得更深一点,但本质上,您也是使用者而非发明者。开大货车可能比开小客车技能要求高一点但也并无本质区别。您如果能沉到汇编语言甚至机器语言那个层次,自己能搞出国产的编译器来,那我敬您是条汉子。

  我们这些普通程序员,不懂“原理和算法”,其实并不一定是真不懂。我们只是没有合适的场合和机会去运用。如果真有合适的场合和足够的利益回报,我们完全可以认真研究并且加以利用,也未见得就比这些大咖差多少。如果有人出钱,我当然可以拿python玩玩贪心算法,学学贝叶斯,搞搞人脸识别(我还真玩过)。不过没人出钱不是吗?:)
头像

附加说明2:
其实这种玩法我不是第一次遇到了。
我有个网银账户,以前一直用IE登录,因为登录界面用到了一个ActiveX控件,众所周知只有IE支持它。同样众所周知的是,去年6月IE被放弃了,现在你在win10打开IE,会自动跳转到Edge。那么咋办呢?

去年的一天,我向银行的客户经理问这个事,经理说,好办,我给你安装一个桌面客户端,具备以前的网页的全部功能。

我一听这么🐮?你们是重新开发了一套吗?事实证明我太肤浅了,图样图森破,装上之后我一看,好嘛,这个“桌面软件”不就是把网页包装起来了吗?其他啥都没变……

头像

附加说明1:甲方爸爸为啥非要将好好的浏览器网页改造成桌面软件?他的理由如下—
他说,那种网站看起来就是公用的,似乎谁都能登录,这让他感觉“不安全,不舒服,不保密”,就得做一个专用的PC端桌面软件给他用,他才会感觉舒服……
当然了,作为乙方,我是不可能告诉他,他要的那个桌面exe其实就是网页的“封装”^_^

结论:做外包,甲方才是天,很多技术都是甲方稀奇古怪的需求逼出来的,阿弥陀佛。

头像

追更:
2023-01-20
Electron 浅学
想到啥说啥,刚开始看到Electron,介绍说是一种最新的跨平台桌面软件开发架构,顿时觉得高大上不明觉厉。
直到前几天有个从1到2的业务查询系统,springboot + vue。客户要求把浏览器网页改造成pc桌面软件。于是采用了Eelctron将其打包,又加上nsis直接打包成了一个安装包。现在总算明白了,所谓Electron就是个打包工具,把“浏览器内核+基于node.js的网页前端”打包成一个桌面软件。它当然能跨平台呀,这不废话么,浏览器本身就能跨平台…

头像

我可以把SQL server、Oracle的存储过程迁移到MySQL^_^,虽然这技能好像没啥用:),不同数据库之间,其实表结构是最好迁移的,因为基本结构类似,视图次之。最难的就是存储过程(Procedure)的迁移,因为不同数据库的变量声明、语句、游标、内置函数都不一样。举个简单例子。sqlserver里面有个sp_executeSql,可以执行动态拼接的sql,并且返回值。但是MySQL中实现类似的功能就很难。

头像

学这么多 多少是能变现的呢

头像
追更:
2023-01-19:
在某乎上有个话题,为啥貌似Python很少用来做大项目。然后一堆人现身说法。我从中学到的是:

Django框架,这是我之前就知道的Python的web开发框架。

Flask框架,某个答主使用过的轻量级python的web开发框架。该大竹说,python框架有个好处是可以方便地引入各种高级计算和人工智能比如numpy之类的包,这个是其他编程语言没法比的。假如你的项目需要用到很多数学计算,则可以考虑使用python框架。

FastAPI框架,基于python的类似于http server的服务端,可以快速创建API

Sqlalchemy, python开发的一款ORM对象关系映射工具,可用于访问各种SQL数据库。
头像
如果有的前辈真觉得以CRUD为代表的数据库操作很简单,那么要不我给您出两个小题,您看看:)

1.假设有A表(学生选课表)和B表(学生选课统计表)

  A表字段: 自增ID, 学生编号,学生所选课程编号
  B表字段:自增ID, 学生编号,学生选课数量

  A表有数千条数据,B表为空。

  现要求:用一条SQL语句,把A表中选课数量大于5的同学的记录写入B表。数据库类型任选。

2.假设有C表(班级表),D表(学生表),E表(学生卡余额表)

  C表字段:班级ID,班级名称,班级类别(甲类、乙类、丙类)
  D表字段:学生ID,学生姓名,班级ID,学生性别(男、女)
  E表字段:自增ID,学生ID,卡类别(食堂卡、通信卡、上网卡、购物卡),卡余额
  
  现要求:用一条Update语句,把所有乙类班级的女生的食堂卡余额都增加100元。
  要求该语句至少用四种不同的数据库语言来写,比如MySQL、SQLite、Oracle、SQLServer、PostgreSQL等等。