分享

你对自己真正的编程能力了解多少?

 timtxu 2017-05-17

前言:我的朋友,在读书的时候,就自己搭建过几个网站,在当时同学之间算挺厉害的。但是有一天他告诉我,自己虽然做了很多东西,但是真正自己亲手写的代码却少之又少,大多数代码差不多都是把别人的整合一下。而到了工作的时候,那些曾经以为编程全是手动一行一行敲代码的想法,在靠一次次复制黏贴后就能解决问题的现实面前改变了。虽然依赖谷歌和复制别人的轮子可以做出很多东西,但是除了利用搜索引擎的能力提升以外,编程能力并没有显著的提高。而且这样的现象使他产生了一个疑问,到底什么样的能力才算是真正的编程能力呢?

播放GIF

什么是系统编程能力?

首先,我们知道,计算机科学有两类根本问题:

①理论:算法,数据结构,复杂度,机器学习,模式识别等。理论问题注重的是深度,它是对在给定的计算能力约束下如何更快更好解决问题的追问。

②系统:操作系统,网络系统,分布式系统,存储系统,游戏引擎等。系统注重的是广度,它是对一个现实需求如何在众多技术中设计出最多又快又好又省的技术组合的追问。

根据以上问题,主要是属于系统编程能力这块的问题,这类能力由于没有简单高效的考察方法,所以很多系统的苗子都因为缺少激励和正确引导而隐没。比尔盖茨曾遗憾的表示,现在许多学习编程的人常把编程看作解各种脑筋急转弯的问题。而其实做系统,不是让你“重复发明轮子”,而是“重新制造轮子”才行。可以这么说,系统的编程能力正体现在“重新制造”的能力上。

我们不妨问自己一些问题,当一个已有的部件不完全符合你的需求的时候,你能改进它吗?如果你用的部件中有bug,你能把它修好吗?在网上繁多的类似功能的部件中,谁好谁坏?为什么?差别在哪?一个开源代码库,你能把它从一个语言翻译到另一个语言吗?从一个平台移植到另一个平台吗?能准确估计自己翻译和移植的过程需要多少时间吗?能准确估计翻译和移植之后性能是会提升还是会下降吗?

总的来说,系统编程能力体现在把没用的代码变成有用的,把现有的代码变得更好,体现在能根据一个做好的轮子画出轮子的设计蓝图,并且解释出设计蓝图中的关键所在,对于哪些是次要的,哪些是不容触碰的,哪些是可以改进的都要了然于胸。如果你一点不懂理论,还是应该学点的。对于系统性能的设计上,不懂是绝对不行的。

怎么提高系统编程能力呢?

①多造轮子

我们都知道,画鸡蛋和会画鸡蛋只是一字之差,但是差之毫厘可能就已失之千里,会画鸡蛋的人就是从多画鸡蛋开始的,本质上是驯服你的手指,感受阴影线条和笔触。所以,自己多写点代码也是一个道理。当你把部件一个个都换成自己手写,写出个编译器、渲染器、操作系统web服务器或者是web浏览器,然后再和现有的部件比一比优劣,注意,从性能到易用性,一定要仔细对比,发现自己的优点和不足,然后认真改进。

达芬奇鸡蛋素描

②多拆轮子

虽然人们常说,多研究别人的代码怎么写,但是实践起来却没有那么容易。原因是许多轮子的设计思想和技术都无可厚非,但是设计和制造过程却杂乱无章,乱成一团,所以多研究别人代码的前提是轮子相对简单,如果轮子相当复杂,那就只好量力而行,浅尝辄止了。题外再提一点,其实轮子不好拆是一个非常严重的问题。重复发明轮子固然是时间的浪费,但当轮子复杂而又不好拆的时候,尤其是原来造轮子的人已经不在场的时候,重新发明和建造轮子往往会成为无奈之下最好的选择。

小结

程序本质是逻辑演绎的形式化表达,记载的是人类对这个世界的数字化理解。不能拆的轮子就像那一篇篇丢了曲谱的宋词一样,能读,却不能唱。以上内容仅代表个人观点,欢迎大家各抒己见,谈谈自己对编程能力的看法。

播放GIF

文章答案来源:刘贺

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多