从小朋友的一道数学题聊聊职业程序员

bluedavy· 2019-09-20
本文来自 HelloJava ,作者 bluedavy

之前辅导小朋友做数学作业时的一道题,从这道题和小朋友聊到了串行、并行,聊到了电脑的结构,聊到了业余程序员和职业程序员的巨大不同。


题目如下:

"阿姨周末在家干家务,收拾房间用时10分,用扫地机器人扫地用时15分,擦桌子用时4分,用洗衣机洗衣服用时25分,晾衣服用时4分,请问阿姨做完这些事最少需要多少分?"


这题的核心显然是哪些地方能尽量并行化,从而提高效率,人和电脑很大的不同是,人只有一个大脑,电脑则可以认为多核CPU形成了多个大脑,使得电脑能够在同一时刻做多件事,不过尽管电脑拥有多个大脑,但它同时还有其他很多地方是共享的,例如内存、磁盘、网卡等,当多个大脑都要同时去操作共享的地方的时候,就会导致串行化,这就对程序员怎么写高效的并行化代码带来了巨大挑战,和小朋友说,一个职业的程序员可以让拥有八个大脑的电脑几乎同时在干八件事,但一个普通的程序员有可能会导致有八个大脑的电脑同时只能干一件事,数学也是我认为的一个程序员最重要的基础,数学高度训练了一个人解问题的思维能力(包括了举一反三等抽象能力),而这也是一切程序的基础,所以我招学生的时候都会特别注意数学成绩。


从这个拓展开点来讲下职业程序员和业余程序员的区别,我觉得要成为一个业余程序员的门槛其实是挺低的。


业余程序员通常就是碰到一个实际的问题或需求,形成一个解决问题或实现需求的思路,然后把这个思路翻译成代码。


但作为职业程序员,除了要做这些外,更重要的是还得考虑:

  1. Robust

    这点我觉得是职业程序员和业余程序员最大的区别,怎么让一个程序在各种情况下都能稳定的运转,这个其实是非常不容易的,写个玩玩的东西不难,要写一个能在生产级robust运转的东西就非常难了。

    举个例子,家里的空调很多现在还不是很智能,尤其是在温控方面,现在通过温度感应器,红外智能遥控设备,可以比较好的做到智能温控,但这类程序一般写的不咋样,如果自己简单的通过这些设备的api写一个其实不复杂,但如果想下怎么让这段程序能robust的运行(例如如果程序运行的机器挂了,温度感应器出问题了,红外遥控的指令是不是真生效了等等),就会发现挺复杂的,毕竟谁也不想这程序失效了,大半夜的热醒或冷醒,:)

    在之前的程序员的成长路线Remix文章里也写到过,能写出防范异常代码的程序员绝对是NB的。

    要做到代码的Robust,会要求在设计和写代码的时候对异常状况有充分的考虑,同时对代码尤其是使用到的API需要深刻理解,经验在这个时候也会发挥一些作用。


  2. 高效

    这个主要就类似前面那个题目的例子,职业程序员应该做到尽可能充分发挥运行程序的机器的能力,这通常会需要对代码运行的机制,怎么写高效并行化的代码要有充分的掌握。


  3. 可维护性

    怎么知道自己写的代码运行的状况,有问题时怎么通过有效的异常信息来处理问题,代码未来的可扩展性,这些要做到其实也都不容易。


所以说,一个程序员的水平通过代码是最容易反应的,可能短短的几行代码,就能看出巨大的差距,当然,其实职业的程序员在上面的几点上彼此也是会出现很大的差距,成为业余程序员不难,要做到上面三点,成为真正的一个写的代码可供生产级业务使用的职业程序员,光要学习的东西就已经不是一个数量级了,同时还需要大量的训练(1万小时理论在程序员行当我觉得也是挺适用的,尽管不代表有了1万小时就一定是个优秀的程序员),感兴趣的可以根据自己的需要去极客时间挑选一些专栏学习,里面很多作者还是很赞的。