软件研发路之一

 

1. 引言

软件研发从业人员越来越多,每个人都是怎么成长的,不一而足。从一个有点编程基础逐渐成长到能将需求自动转化为解决方案,虽然每个人的能力不同,但这个路可能也不会很漫长。

本文主要介绍笔者如何从最开始对计算机一无所知到目前信息管理领域从业10多年的心路历程和感悟。

 

2. 打点基础

想要从事计算机软件研发,总要打点基础的。笔者进入大学才有幸接触计算机专业,然后从开机、关机、数据存储到3.5英寸的软盘开始接触计算机。2000年初大学开设的课程都是C语言、汇编语言等编程语言课程,其他工具类的是UML及相关软件介绍、微软SQL Server等。高级语言几乎没有,但是做课程设计都是自学VB或者Delphi之类。

想要从事软件研发之路,无论是哪种编程语言,都要打点基础。这里的基础是起码得知道计算机和二进制的关系、基本的数据运算、运算逻辑等。给定一个输入,转化为输出,这就是最基本的需求,差别就在于如何转化,每个程序员给出的算法逻辑不同,才会导致各个方案在效能上有所差别。

 

3. 选好编程语言

软件开发不仅仅是掌握一门或多门编程语言,更需要了解自己想要从事的行业背景和业务知识。不同行业对于编程语言的要求是不一样的。

如果想从事硬件开发,可以学习C语言或汇编语言;如果对网络或者计算机底层比较感兴趣,可以学习C/C++;如果你想从事信息系统开发,可以学习高级语言,这里又包括网页端开发、移动端开发、后台系统开发;想要从事网页端开发,学习Html,CSS,JavaScript或者其他前端框架;想要从事移动端开发,学习现在流行的iOS或Android 原生程序开发,或者跨平台的框架;想要从事后台系统开发,就要学习Java,.Net等。

刚开始大家差不多,都是白纸一张,学习什么都还行,越往后走,越发现程序员之间差距越来越大,技术路线不同、思考方式不同,正所谓隔行如隔山,不同行业的程序员的在解决各自领域的业务问题也千差万别。

根据各自的兴趣来选择一门编程语言,目的是通过一块敲门砖,打开进入行业软件开发的大门。除了开发经验的不断积累,渐渐的会发现业务知识才是在一个领域深耕的根本和王道。

 

4.  面向对象思想

高级语言提到面向对象,就会想到它的三个基本特征,分别是封装、继承和多态。但是是不是非高级语言就没有面向对象。笔者最初学C语言时,并不知道面向过程和面向对象,一是书读的少知识面窄,二是缺少去了解这些的途径。不知道除了C语言还有别的东西,都是跟着课程安排走,说到底,就是懒,缺少主动性。等到学面向对象课程的时候,了解到还有面向过程和面向对象的区别,在这之前通过C语言编程都是面向过程的。再往后,才知道C语言可以实现面向对象。面向对象是一种思想、一种方法,不能拘泥于手上的编程语言。

最基础的是封装。笔者理解的封装就是为了复用,不同的业务可以使用同样或类似的输入获取同样的输出,那就应该把这段业务逻辑算法封装起来复用。当然总有人会说两个业务有那么一点点不一样,那这就要考验你有没有把类似的算法封装成多个地方都能满足的算法的能力。解决这些问题的方式有多种多样,比如再学习下设计模式。有机会给大家分享下重构到设计模式,重构代码最基础的方式就是从繁杂的算法中抽取类似的算法并进行封装,慢慢重构,最后可能达到了继承和多态,甚至达到对某个设计模式的运用。

学习面向对象的可以学习UML,对于UML的学习的过程就是在学习面向对象。面向对象首先关键在对象。通过收集开发需求,从需求中识别对象,以及对象之间的关系,从而通过UML展现出这些关系并建立起分析模型,再转化为你掌握的语言中的类、接口、方法。通过对自己代码的不断优化、重构实现面向对象,甚至是运用到设计模式。

 

5.  训练逻辑思维

每一段程序都是通过对一定的输入进行一定的逻辑处理,得到相应的结果。不同的逻辑,得到的结果可能是正确的,有时候可能又是错误的。除了能将一个需求拆解为有先后顺序的人人都能理解的业务步骤,每一个步骤还要通过编程环境编写成一行行可编译、可执行的代码,这些可编译的、可执行的代码是否覆盖了一个业务步骤的所有逻辑分支情况,将是衡量一个程序方法质量的标准。比如银行卡转账这么一个需求,可以被简单地拆解为从账户A扣款、转入账户B,这两步是一般人可以理解的。每一个步骤又可以继续拆,账户A是否有足够的金额,金额不够应该怎么办?账户B不存在怎么办?转账的账户B一瞬间,发生意外怎么办,比如断电。这些业务分支可能已经超出客户原有的需求。但是软件就是这样,在这种涉及交易的系统中,对逻辑的要求更高。

程序设计首先要求思维具备严密的逻辑性,只有逻辑严密才能将需求背后的分支情况都考虑到,才能保证程序的质量,满足客户的需求。

UML中的数据流程图是用来训练逻辑思维的利器,在动手将一个业务步骤转换成一段可执行代码时,可以先通过数据流程图来展示,每一个数据处理框、每一个判断分支都要深入考虑,不断询问自己这个数据流程图是否覆盖了所有业务分支。数据流图的绘制可以是多种表现方式,一般会通过软件绘制,不过,笔者曾经也会在地铁上、书桌前,只要有一张纸,一支铅笔,手绘也能完成一个业务步骤的数据流图。当一个业务特别复杂时,潜心研究业务数据流图,会让你更专注,效率更高,数据流图弄清楚后,将数据流图转换成程序代码,会更得心应手,最终编写出来的代码质量更高,更具有鲁棒性(Robustness)。久而久之,你就可以在脑子里快速的将业务转换为数据流图,做到“落笔生花”,信手拈来。

数据流图是面向过程的,你可能会问,这样是不是不够高级,不是面向对象?对于初学软件编程的人来说,首先要锻炼的是自己对于一门编程语言的熟悉程度,语法要稍微熟悉一些,其次就是不断提高自己对于执行逻辑的思考和转化能力。不能进行有效的逻辑思考,就无法实现需求的程序化处理。先把自己训练成一个可以通过一门熟悉的编程语言,将需求拆解成可完备执行的逻辑的程序员。代码写得多了,只要你是一个有sense的程序员,你就会慢慢学习别人是如何把代码变得更优雅、易读、甚至是一开始就通过加入面向对象的思想、重构或直接使用设计模式,使得你的程序更易维护、易扩展。

 

6.  多读书、多搜索、多学习

经常读读自己选好的这门语言的经典书籍,这些书籍都不一定是电子书籍,适当在自己的书架上摆上基本经典书籍。笔者一直从事.Net平台的开发,如果相了解.Net基础知识,推荐阅读类似《Microsoft.NET框架程序设计》的书。打好了基础,能自己动手编写可运行程序,且逻辑正确了,对自己要求高的,愿意学习高阶程序,推荐阅读类似《C#高级编程》、《Effective C#》之类;想要把代码写的更优雅、更规范,可以学习《重构 改善既有代码的设计》;想要在设计模式上有所扩展,如果觉得设计模式起源的最经典的GoF(Gang of Four)的书《Design Patterns: Elements of Reusable Object-Oriented Software》过于枯燥,可以阅读Head First系列之《深入浅出设计模式》或者《C#设计模式》。这些书籍,不全是.Net的,很多经典的数据都是基于C++,特别基于Java来写的,对于任何一门语言相关的书籍的学习,主要是学习它的思想,而不是里面一行行的代码。市面上,这些书籍名字相近,但内容不尽相同,笔者基本都是阅读英文版或者翻译版,最好先阅读业界大神的书籍。

经常利用搜索引擎搜索你遇到的编程难题或者遇到的错误提示,你遇到的问题,总会有人在网上提到的。有些问题看起来类似、但不一定就是和你遇到的一模一样,耐心的阅读、尝试。

初学者,看书比较枯燥,有些看了就过了,看书的目的主要是给脑子里种下思想和印象,还是要经常进行在线学习,包括看一些教学视频或者程序员社区网站,比如博客园、CDSN等,对于在线的代码或者下载的代码,一定要仔细了解别人代码的来龙去脉,必要时进行逆向工程,通过数据流程图、序列图等任何可以帮助自己理解别人代码的业务逻辑或算法的图来帮助自己,提升代码的理解能力。任何书籍、网站、视频,光看不动手,效果会大大打折。

 

7.  实践出真知

所谓实践,就是要把看到的,抄来的,放到自己的IDE中,运行起来,遇到问题要自己理解问题的描述,实在不明白就要求助搜索引擎。搜索也是有学问的,一是自己能不能提炼出你要搜索的问题的精髓,就是关键字,千万不能一长串话放进去一起搜。程序运行过程中遇到的问题,错误提示可能是一个错误代码和一些看不懂的提示,要么就是中英文混在一起的错误提示,一定要抽丝剥茧,一整段错误提示放到搜索引擎,可能搜到的东西很少,度娘解决不了的,就想办法用Google。

笔者这么多年对于已有产品的代码的学习,就两种方法。一是软件运行起来,调试,调试,调试,重要的事情说三遍!在一个没有代码所有相关文档,没有参考的时候,调试怎么调,对于自己感兴趣的功能,猜想它的关键字,但凡是写的好的产品或代码,笔者相信代码是易读的,因此命名上一定是比较规则的,单词是不会写错的,大概的几个单词全文搜一搜,搜到的地方,整体看看代码逻辑像不像,或者不管三七二十一,下个断点,执行界面功能,看会不会进入断点调试,看不懂的地方单步调试,看得懂的地方快一点过去,准备好UML软件,或者纸笔,把遇到的业务逻辑画出来,通过这种方式来理解软件一个功能的业务逻辑,久而久之就可能可以把整个软件的架构勾勒出来。第二就是“使用暴力”,都说大力出奇迹,产品代码也一样,有了代码管理工具,程序员本地的代码无论怎么折腾,都是不会影响产品代码的,只要不提交就不会造成别人的问题,还可以回滚本地已经修改的代码。一些看不懂的地方,偶尔修改一下,看看修改后会有什么问题,还是调试,调试,调试,看看结果,有助于对于一小段代码的算法的理解。

一定要动手,光看不练等于纸上谈兵,对于提高编程技巧是毫无作用的,是解决不了问题的。

 

8.  提高洞察力、保持好奇心

新入门的程序员经常会问:诶,我抄来的代码怎么就不行,为什么网上的就说可以的。我们也经常听见一句话,QA或客户说我这里有问题,这样这样可以重现。程序员说我完全按照你的步骤,这样这样操作,就是没有问题。程序是一个很机械式的东西,电脑不会说谎,有问题就肯定有问题。

程序员解决问题的能力(Troubleshooting)也是一个重要的技能点。对于初学者,程序提示的错误提示需要仔细理解,代码的一行行的读,一行行的比较,不要漏过一个单词,甚至一个字母。提高洞察力,保持好奇心,才能发现问题所在,结合实践和动手能力,才能在入门初期快速进入状态。

 

9.  写在最后

软件开发是存在一定难度的,对于刚入门的程序员,过程比较很辛苦,需要付出很多努力,但一定不能半途而废。电脑有辐射、程序员喜欢久坐不起,经常锻炼也是必要的。

 

posted @ 2020-12-12 22:03  kevinku  阅读(162)  评论(0)    收藏  举报