一 一些感受
对于大型软件系统,如何能够更好的掌握其运行过程?这个问题的答案,更多的时候是只能意会,而无法言表的。就像许多伟大的设计,有时候就是灵感的迸发,并没有那么多为什么。如果非要表达出来一些什么,那我想应该是,脑海中对软件的构建运行有一个联系实际的硬件和部署的立体的结构,简单说就是有一份素描。它能够帮助程序员更好的理解当前程序的运行,从而更快的得到问题的解决方案。
我们知道写文字需要热身。比如,经常会有这种感觉,一口气阅读某一方面很多的内容,就感觉对该方面不仅知其然还知其所以然。这也有点像突击复习考试。其实,编程也需要热身。先对代码进行一些调试,就会有助于后续代码的编写。就如先阅读相关领域的文章,有助于更加集中精力激发领域的创新观点一样。
大道至简。
尝试用中国人惯有的思维来看待问题。什么惯有的思维呢?就是用简单的内在道理描述复杂的外在事物。就像中国的阴阳八卦理论,一种哲学的思维来看待万事万物。
对于计算机和程序设计,当你抛弃细节,认为计算机就是那么回事,软件设计也就是那么回事,从简单的二极管到复杂的现代计算机集群系统,一切都是从0和1演化而来,就有点像八卦里的两仪生四象,四象生八卦......万般变化徐徐生成。
写程序要追求对称美、形式美、思考美、结构美、结果美。这种美是根植于骨子中的,难以言表的,让人激动的美。
二 我的观点之程序员进阶路线
作为国内一线的技术开发人员,你也许听到过或者看到过这样的一种观点:国内做程序员,在做到一定年限后就要考虑做管理,否则以后的职业发展将受限。之所以会有这种观点,是因为在国内做技术没有前途。如果你快四十岁了还去应聘程序员,对方就会认为做了这么多年程序员还做程序员,这个人能力肯定有问题。另外,国内的技术开发大多都是简单的二次开发,没有什么核心技术,没有什么创新,几乎都是在老外做好的平台上进行应用性的开发,很少涉及基础性的大规模研发。因此,国内的程序员要求都不是很高,找个毕业生培训一段时间就能胜任工作,还且年轻人更能加班,所以,所谓的程序员,就是脑力劳动闪耀光环掩饰下的廉价劳动力。在国外情况就不太一样,甚至在我们的邻国日本就有很大的区别。在那里,程序员可以作为一个职业,虽然是一份普通的职业,但可以干到老。而且越老越吃香,而不是反认为无能的表现。之所以会形成这种局面,很关键的一点就是:老美和日本都有自己的核心技术。他们的程序员在做核心技术,要求有深厚的算法功底,有丰富的开发经验,这样才能做出大的系统,稳定的系统。而这些对程序员的基本要求,是需要通过实践的锻炼,同样也需要时间的磨练才可以达到的。俗话说的好,好功夫都是刀尖上滚出来的。其实这样就形成一个良性的双循环,做管理的专注于自己管理的部分,做开发的能够专心的做开发,收入不比管理者少。而在国内,因为大部分公司都是急于求成,乐于使用现成的框架,缺乏创新,所以对程序员的需求不同,导致结果也就有很大不同。要是在中国的高校走一圈,你就会发现,大家所能拿得出手的东西,很多都是在老外完成的核心技术基础上,通过类似搭积木搭出来的。就连创新的最大发源地——大学都是这样,你也就不奇怪整个中国的软件产业为什么都成这样了。
不同于传统的论调,那些乐观派的专家,在这时候都会这样说:“但是我们欣喜的发现,这种现象正在发生改变。越来越多的中国软件企业,开始将更多的资金投入到研发中,努力掌握核心技术......”。但是实际现状仍然难有改变,(只不过现在更多的时候是抄袭国外的创意,从早期网站到现在的APP,然后拿来为自己所用。比起单纯的拿来主义,这也算是一种进步了。)而且差距越来越大,因为现在的软件系统越来越庞大,也越来越复杂,所以越是依赖,差距就肯定越大。
如果你是一个技术开发人员,而且是一个积极上进的开发人员,还怀揣着年轻时的梦想,想着创业,想着拥有自己的事业,想着改变中国的民族软件产业,那么下面的这条发展路线也许就是你的选择之一:
一开始,你可能只关注你所在的项目组负责的项目,而且是一个很小的模块,那你还是一个“井底之蛙”,还只能看到局部,不能看到全局。好在现在有了网络,资讯更加发达,这就为你准备了一双隐形的翅膀,随时助你一臂之力,使你能够飞出来看到更大的天地。也为你准备了一个潜望镜,使你即使不用费劲的向外爬,也能洞悉外部世界的变化。但是一切努力需要你自己完成。当你只负责一个模块的时候,你就要负责好自己的模块,脚踏实地,而且要做的比别人好。也许这并不难,但是这种态度却需要不断培养。也许别人做的只比你好一点点,但是结果却可能有很大的不同。有个笑话是这样说的,话说两个人在山上遇到了一只老虎,这可吓坏了两人,于是这两个人撒腿就跑。就在这时,差别出现了,其中一个人边跑边脱掉了衣服,另一个人就笑话他,说你就是脱光了也跑不过老虎啊,而另一个人则不以为然的回答道:我不用跑得过老虎,我只要跑过你就行了!现实就是这样,很多时候别人只是比你做的好那么一点点,但是结果却差别很大。
当你在一个项目组负责一个模块时,如果总是能做的很好,这就说明你有更强的能力。那么当一个新的项目到来时,你就比别人拥有更多的机会去负责这个项目。
当你负责的项目比较大时,可能就涉及到了一款产品。这时,这个项目的成功完成,就意味着有一款新的产品要推出了。而且很有可能这个产品,就是你们一系列产品中的一种。刨除其他因素,如果你在负责项目时,在稳定性、简洁性、易用性、低内存高性能以及升级等方面,做得比其他人好,即使好那么一点点,那么你的产品也将更具竞争性,毫无疑问,你的项目也将会更成功。
如果你在负责一款产品时,总是能做的比别人好,那么你极有可能将会负责同类的一系列产品的研发。也许此时的你已经成为了产品的技术研发主管。想想最开始,你只是一个项目的一个模块的小小负责人,现在已是研发主要负责人,差距是很大的。可是难吗?你只是在每一步上,都比别人多用那么一点点心,做的好那么一点点而已。也许当初跟你在同一个组的另外一个研发人员,现在还在负责小模块,而他可能也始终想不明白,你并不比他能力强多少,为啥现在差距这么大呢?
纵观上面的这个过程,实际上是一个从小节到大局的转变和发展过程:
一开始你只负责模块,关注于技术细节。当你做的足够好后——
你开始负责更大更多的模块。这时,不仅要关注技术细节,还要关注模块之间的配合。当你总能做的很好后——
你开始负责项目整体。这时,在技术细节上,你已经有了不错的积累和掌握,不论怎么变化,你都能做出很好的和更加正确的判断。而因为负责的东西更多更大,你开始考虑产品整体的框架。当你做的很好后——
你开始负责产品。这时,你已经对现在所使用的各种框架都有了了解,了解他们之间的不同和优缺点,甚至有些架构出自你手,你能很清楚的判断框架的某些变化会对整个项目有何影响,这时你开始更加关注产品所实现的各个功能了。当你做的很好后——
你开始负责这一系列的所有产品。这时,你已经不主动考虑技术因素,而是完全的产品化的观念。增加或裁剪什么功能,技术实现难度多大,对你而言已经不是什么难题,你都能够快速的做出判断,轻松应对。此时的你更多的是考虑整个产品的市场定位,同类其他产品的特点,用户的习惯等,而不再单纯是技术问题。当你做的很好后——
你决定推出一款新的产品。此时——
你开始考虑产品的导向,比如面对的用户群,需要实现的特色功能,更加具有竞争性的功能等。
你开始考虑这款产品的可实现性,包括硬件角度和软件角度。
在可行性验证后,你开始考虑产品的整体架构,包括硬件架构,软件架构,整体技术需求及难度。
完成架构后,你开始考虑功能模块划分,这可能包括硬件功能模块划分和软件功能模块划分。
各个模块的实现和所要关注的技术细节,此时已经在你脑子里过了一遍了。
你开始物色人员负责项目、模块。你选择了那些在各个位置上,可能只比其他人好那么一点点的人来负责。
最后你准时推出了新产品的样品并最终进入市场。
此时,你已经有了相当丰富的经验,你决定退出现有公司自己创业......一切似乎都是那么熟悉,最终完成了一个大循环。
三 我的观点之关于做产品
通过你的经验积累,你发现,现在的互联网软件产品,拥有大量用户才是王道。有人说,某某企鹅之所以厉害,不是因为他产品做得最好,而是因为其绑定了千千万万的用户。技术对它来说不是瓶颈,所以它的复制可以成功,同时你的成功也可以被它复制。现在的互联网产品,不但要拥有用户,还要培育用户习惯,才能拉住用户不断前进。
不过随着咱们国家软件产业的不断深化和成熟,用户习惯的逐步养成,理性和本质需求逐渐占据上风,加之产业赛道的变化,这一现象也在改变之中,产品本身的因素显得越来越重要。比如各种手机、APP重新划分了江山地盘。
对于做产品,特别是软硬件结合的产品,比如手机、消费电子产品等,以产品为中心,可以从很多角度来看待,而且某一个角度看到的部分,在其他角度来看,就可能在两个或者更多的划分中。反过来也一样。可以从模块和细节两个方面来入手。模块涉及到大的方面,细节涉及到小的方面,但是对产品都很重要。产品产生的过程,就是不断迭代细化的过程。
有一种全面掌握产品各个方面的方式,就是思维导图。对于软硬结合的产品,可以一半展示硬件,一半展示软件,也可以软件和硬件单独来做。比如在嵌入式开发总结之总体目录中的开篇图:
https://blog.csdn.net/wwwyue1985/article/details/113793467
可以横向来看,也可以纵向来看。横向就是我们看到的各种功能,功能间的依赖等。纵向来看,就是从架构的角度来观察,上下层的依赖关系等。
实际上,思维导图并不好弄,相互交叉是最大的问题。就软件来说,可以从功能模块的角度进行划分,分成各个模块,也可以从程序的角度来分,分成各个小程序,就像开始说的,可能从一个角度看到的,从另一个角度看就不是一个了。比如一个功能,可能涉及到了多个程序的多个部分。而一个程序,又涉及到了多个功能也有可能。
所以这个思维导图第一步,就是尽可能的挖掘,挖掘自己对产品涉及各个方面的理解。把这些东西当做要素,先列出来,然后再排版。先发散,后聚合。就好象拼图,先把碎片都收集起来,再拼接。
举个例子:以多媒体为中心的导图。外围包括5G、WIFI、媒体中心、DLNA共享、开机服务、升级等等,发散开来,收集要素。细节到任何程度都不为过。
站在用户的角度,好产品的定义是,首先满足需求,特别是满足用户的痛点需求。其次是一定要很好用,每一个操作都要流畅,每一个操作也要简单。把复杂的功能,做到简单,不容易;而把简单的功能,做的复杂,倒很简单。所以,简单并非容易,复杂并非艰难。
另外,好的产品,讲究用户的体验。稳定,简单,流畅,都是基本要素。这块,后续可以再展开。比如,导出一些关键字,然后再组织文字。
除此之外,好的产品,还讲究美学。对于软硬结合的产品,不单单包括基本的外在美,也就是外观美,还要求内在美,包括电路设计美,软件设计美。这种美和简单的要求,贯穿于产品的各个方面,包括小到一个打印输出。这块,苹果产品是业界标杆,学习榜样。
四 我的观点之如何突破自己
做程序,做软件,做产品一段时期后,都会有一段瓶颈期。此时,突然间会感觉到无所适从,无从下手。貌似自己对各方面都了解了一些,找不到什么挑战了,但是似乎又有许多不明白的地方,却不知该如何突破(对应四个范围,不知道自己知道,知道自己知道,知道自己不知道,不知道自己不知道)。包括对技术,对底层硬件理解,对上层功能模块等等,各个方面。此时,开始游曳于网络的海洋,寻觅那传说中的启明灯。系统架构,软件架构,硬件架构,每一个提出来,都感觉像是大象无形,不能够从整体上把握。于是看这书那书,希望能从中找出一条路来,找到一条捷径来,从而找到答案。但是当我们转了一圈,而且是忙忙碌碌的转了一圈后,发现自己还是站在原地,并没有前进,时间就这样浪费了。其实,仔细想想,不光是软件,包括其他行业,都存在这类问题。
那么,如果突破自己呢?或者说,如何找到突破自我的方法呢?其实,很多时候,正当我们为无路可走而焦虑时,路就在脚下,就在身边,而你,缺的就是发现。所以,当你需要突破自我时,为什么不从现实中的例子下手呢?而且通常这样的例子还不少。比如,你要进行硬件架构上的理解,为什么不去看看现有的那些经典的设计,那些大公司的漂亮的设计,那就是最好的学习材料;要构思软件架构,可以看看那些现有的优秀的软件的设计架构,拿几个过来分析一番,学习一番,相信一定会有很大的收获的。其实放眼望四周,这样的例子生活中比比皆是,只是我们不善于发现而已。
当你想要做一个很美的设计时,找找周围那些漂亮的设计,想想为啥要那么设计,为啥那样设计看起来更美,这就是学习的方法,比直接找本书,告诉你怎么设计怎么设计一堆理论的东西,要更加的丰富,更加的生动。在解决一个个问题的过程中,结合理论,这就是最快的学习速度。这其实就已经是捷径了,但是自己的设计,还是要自己动手完成,这个过程需要发挥创作,这就是需要锻炼的地方,需要熟悉掌握的地方。只有经过自己大脑思考的、自己的手完成的东西,才是自己的,这就是学以致用。
最后,善于从生活中学习美的东西,并将它们记于脑海,你就大踏步的走在通往突破自我的路上了。
话说,只有善于思考,才能不断快速进步。而这一切的一切,又最终归结于三个要素:时间+天赋+努力。