图片来自网络
想成为专业软件工匠,需要持续学习新的东西,最新的技能,新语言,新框架。当然还需要学习并掌握一些经典的解决问题的方法论,如设计模式(GOF),各类算法。
每当我想在软件工匠这条路上有所精进的时候,我就想到算法,每当我刷算法题的时候我就难产/卡壳,然后就没有然后了。过一段时间,我又会重新燃起兴趣,我又想成为一个软件工匠了。然后算法再一次将我按在地板上摩擦。很现实。

也许我不该将自己的思维固化,以为要提升自己的技能一定要搞算法,好像算法就是绕不开的坎,事实上,从学习的角度来说,我不需要将所有的算法题目都从头做到尾,我可以模仿,可以抄写,然后拿新学的编程语言来练手,也就是《代码整洁之道》这本书上所提到的kata练习,坚持每天练习十分钟,这样既可以练习算法,保持个手熟,又可以练习新学的编程语言。
另外,不一定什么热就要学什么,比如现在热门的人工智能,大数据,这些内容,没有一定的数学基础,没有一定的算力,没有一定的数据源,可能都没法深入。再一想,其实人工智能和传统的计算机领域其实是两根不同的赛道,人工智能算是数学,而只是人工智能需要计算机来完成,所以就跟计算机有了关联,让人误以为人工智能是计算机的一个分支。现在人工智能新的发现或新的突破,都是因为算法和硬件算力有所突破,而跟传统的计算机领域的新的实践和知识没有太多的关系。我没什么数学天赋,所以人工智能就算了吧,还是努力成为一个有专业素养的计算机工匠吧,当然,我距离这种状态还很遥远。
明白了自己的定位,回头说说传统的计算机领域或者软件领域的事情吧。《代码整洁之道》这本书提到,需要多看一些论坛,看看当下的热点内容,头条,知乎,掘金,公众号。
在本书中,列出了需要学会的知识:
1. 设计模式,前面已经提到,光知道这些设计模式还不行,还需要有实战的经验
2. 设计原则,文中有提到叫SOLID的原则,而且需要深刻理解组件设计原则
3. 方法论,要理解极限编程,scrum,精益,看板,结构化编程和设计
4. 实践,测试驱动开发,面向对象设计,结构化编程,持续集成,结对编程
5. 工件,UML图,DFD图,结构图,Petri网络图,状态迁移图,流程图和决策表。
这些内容,有些我压根没听书过,惭愧,我都觉得我这10年都白忙活了,或者是因为我们公司对这些技能/知识不是很在乎,或者,我过早的走到了manager这个位置上,还没来得及在IC的位置上去尝试,去探索。将时间再往前推,回想当年在学校的时候,写的代码也不多,可能是因为我是电子专业的缘故,写代码的场合也不是特别多,所以我充其量算是半路出家的伪程序员,到今天才明白这一点是不是有点晚了,快四十了。
几乎所有的知识都可以从公开的场合找到的,我现在缺少的就是更多的练习,对新技术/概念的好奇心,和探索的耐心。这需要额外的努力,毕竟分散精力的事情还是很多的。
软件开发的应知应会只是这本书的开胃小菜,这本书的重点在于软件设计的一些哲学和方法论的东西。而只有注意到这些细节,才能从软实力上具备成为一个软件匠人的资格。
第一,要了解你的领域,你做的软件或者硬件是给客户用的,是解决他们的业务中的实际问题的,那么作为为他们提供服务或者产品的专业人士,你务必要知道,你的客户将会怎么使用你的产品,你的产品解决了什么业务问题,是怎么解决的,他们在使用的过程中,有碰到什么痛点吗,有没有用起来不顺手的情况,你的产品稳定吗,会不会三天两头出问题,出了问题,有人帮助他们快速解决,并且能够不给或少给用户造成损失吗?
第二,用自己的专业知识作出判断,千万不要为了迎合你的老板,或者维护你的颜面而作出伤害团队和客户的事情,这就是要用你的专业技能,有力的说不。千万不要说,我试试,这是一种不负责的做法。你的一句我试试会变成听者的一个期望,试试通常表示你还是能做出来的,他们觉得你只是谦虚。而从你的角度来说,你是想降低别人对你的预期,你是在给自己留后路,其实是你自己没把握,而又不想让别人失望。你是太狡猾了,这不专业。
所以针对说“是”还是说“不”的时候需要秉持的一个原则就是,使用创新的方法,尽可能的解决对方的问题,毕竟作为专业人士,人家还是希望你能帮他解决燃眉之急的。但是,承诺依然是在你的掌控之内,而且需要尽量清楚表达你的承诺,确保双方都能理解。更重要的是,要让对方知道你为了解决他的问题有了额外的付出,而这样的付出是需要额外的成本的,比如更多的费用或者是事成之后更多的休息时间。总之,做承诺的时候,你是一个理性的人,不能为了一时的冲动而乱承诺,进而毁了所有人。