程序员人生 网站导航

什么才算是真正的编程能力?

栏目:综合技术时间:2016-07-04 08:44:32

问题:甚么才算是真实的编程能力?

 

还 在读书,也在实验室帮忙做了些东西,自己也搭过几个网站。在周围人看来似乎好像我很利害,做了那末多东西,但是我发现这些东西虽然是我做的,但是实际上我 手把手自己写的代码却并没有多少,很多都是用开源的东西,我写的代码不过是把他人的东西整合下,类似于胶水1样的工作。

 

我之前所认为的编程是全手动1行1行敲代码,但是现在我发现哪怕是工程上也有很多人是复制黏贴来解决问题的,并且提倡不要重复造轮子。

 

但是靠谷歌和复制他人的轮子,虽然我做出了很多东西,可是我其实不觉得自己能力上有提升,倒是利用搜索引擎的能力的确提升了很多。而学校里另外1波弄ACM的人,他们每天刷题练算法,也许倒是的确提升了点编程能力,但是对工程几近1窍不通。

 

所以我现在就很困惑,所谓的编程能力究竟是甚么,我该如何提升自己的编程能力?

 

回答者:刘贺,...

 

非常好的1个问题。这多是我在知乎见到过的问编程有关的问题中问得最好的1个了。我非常喜欢这个问题。

 

计算机科学有两类根本问题。1类是理论:算法,数据结构,复杂度,机器学习,模式辨认,等等等。1类是系统:操作系统,网络系统,散布式系统,存储系统,游戏引擎,等等等等。

 

理论走的是深度,是在追问在给定的计算能力束缚下如何把1个问题解决得更快更好。而系统走的是广度,是在追问对1个现实的需求如何在众多的技术中设计出最多快好省的技术组合。

 

弄ACM的人,只练第1类。像你这样的更偏向于第2类。其实挺难得的,但很惋惜的是第2类能力没有简单高效的丈量考察方法,不像算法和数据结构有ACM比赛,所以很多系统的苗子都由于缺少鼓励和正确引导渐渐就消隐了。

 

所以比尔盖茨才会说,看到现在学编程的人常常都把编程看做解各种脑筋急转弯的问题,他觉得很遗憾。

 

做系统,确切不提倡“重复发明轮子”。但注意,是不提倡“重复发明”,不是不提倡“重新制造”。恰恰相反的,我以为,系统的编程能力正体现在“重新制造”的能力。

 

能 把已有的部件接起来,这很好。但当你恰好缺1种关键的胶水的时候,你能写出来吗?当1个已有的部件不完全符合你的需求的时候,你能改进它吗?如果你用的部 件中有bug,你能把它修睦吗?在网上繁多的类似功能的部件中,谁好谁坏?为何?差别本质吗?1个开源代码库,你能把它从1个语言翻译到另外一个语言吗? 从1个平台移植到另外一个平台吗?能准确估计自己翻译和移植的进程需要多少时间吗?能准确估计翻译和移植以后性能是会有提升还是会有所降落吗?

 

系统编程能力体现在把已有的代码拿来并变成更好的代码,体现在把没用的代码拿来并变成有用的代码,体现在把1个做好的轮子拿来能画出来轮子的设计蓝图,并用道理解释出设计蓝图中哪些地方是关键的,哪些地方是次要的,哪些地方是不容触碰的,哪些地方是还可以改进的。

 

如果你1点不懂理论,还是应当学点的。对系统性能的设计上,算法和数据结构就像在自己手头的钱1样,它们不是万能的,但不懂是万万不行的。

 

怎 么提高系统编程能力呢?土办法:多造轮子。就像学画画要画鸡蛋1样,不是这世界上没有人会画鸡蛋,但画鸡蛋能驯服手指,感受阴影线条和笔触。所以,自己多 写点东西吧。写个编译器?渲染器?操作系统?web服务器?web阅读器?部件都1个个换成自己手写的,然后和已有的现成部件比1比,看看谁的性能好,谁 的易用性好?好在哪儿?差在哪儿?为何?

 

更 聪明1点的办法:多拆轮子。多研究他人的代码是怎样写的。但是这个实践起来常常很难。缘由:大部份工业上用的轮子可能设计上的思想和技术是好的,都设计和 制造进程都很烂,里面乱成1团,让人乍1看毫无头绪,致使其对新手来讲非常难拆。这类状态其实非常糟。所以,此办法1般只对照较简单的轮子好使,对复 杂的轮子,请实事求是。

 

轮 子不好拆,实际上是1个非常严重的问题。重复发明轮子固然是时间的浪费,但当轮子复杂而又不好拆的时候,特别是原来造轮子的人已不在场的时候,重新发明和 建造轮子常常会成为无奈之下最好的选择。这是为何工业界在明知道重复发明/制造轮子非常不好的情况下还在不断重复发明/制造轮子的根本缘由。

 

程序本质是逻辑演绎的情势化表达,记载的是人类对这个世界的数字化理解。不能拆的轮子就像那1篇篇丢了曲谱的宋词1样,能读,却不能唱。

 

鄙人不才,正在自己研究怎样设计建造1种既好用又好拆的轮子。您没那末荣幸,恐怕是等不到鄙人的技术做出来并发扬光大了。在那之前,多造轮子,多拆好拆的小轮子,应当是提高编程能力最好的办法了。

 

 

回答者:mu peng,less is more

 

晓得取舍。


在有限的时间内,几近没有系统可以做到完善。要快,要安全,高并发,易扩大,效力高,容易读,高内聚,低耦合...

 

大到1个网站,小到几个class,工程师都要清楚,要取甚么,舍甚么,这其实不是那末容易的事。我们都有自己的性格,有的求新,有的求稳,有的求快,但具体到1个项目时,知道如何取舍对这个项目最好,很重要。

 

学校里的作业,没人在乎你是否是写在1个大的main()里面,能跑就行。但做项目的时候,太多的东西要斟酌,有时候,宁可简单易读,也不用快那末1点点;有时候,要做太多看不到的工作,却丝毫马虎不得;有时候,写了不如不写,留白也是1个学问。

 

曾接手个项目,里面几近所有的class,每一个都有interface,各种继承,各种实现,理由是灵活性高,易扩大。真的易扩大吗?

 

我不知道。没多久,客户的需求就改了,各种拎不清的继承实现都子虚乌有,1大半要重写。

 

问题在哪里?

 

不是编程不好,而是取舍的不好。在那个阶段,为30%的需求,花200%的努力,寻求设计的滴水不漏,却舍弃快速实现,获得反馈的时机,这就是失误。需求总会变,客户看到越早,修改越早,影响越小。

 

很聪明的人,也可能做出很难用的系统,不1定是编程不好,多是不愿,或不屑于取舍。不同的阶段,不同的项目,要取舍的东西也不同。编程只是手段,目的是解决问题,能力高不高,要看问题解决的好不好。不在于使用了甚么高端算法,或是复杂的框架。

 

晓得如何取舍其实不容易,需要对问题的深入理解,对技术的成竹在胸,和身后无数个踩过的坑。但重要的是有取舍的意识,主动思考取舍甚么,这样学的才会快。

 

回答者:李遥,A Programmer

 

既然说的是编程能力,那首先就先把学术相干的能力排除才能说的清楚

 

接下来是我对编程的定义:所谓编程,就是预先设计好方案来指挥行动可预测的系统来自动(与临时手动相对)到达的想要的结果。从广义上说,企业家对1个公司的运作方式进行设计,然后这个公司自动运行产生利润也是1种编程

 

那末编程能力体现在两点

 

1.对可预测系统的理解:理解越深,预测能力越强,自己的智慧才越好发挥。这就是为何学习软件编程最快的方式之1是“造轮子”

 

2. 如何把自己的目标转化成指挥方案,这其实就是“做利用题”的能力,我们从小学就在练习这个能力。现实世界的利用题可不会告知你用甚么知识点去建模,也不会 流露全部必要条件,因此增强这个能力需要深入理解现实世界的运作方式。在软件行业,这被称作“理解垂直行业的业务逻辑”

 

顺带说1下,所谓“Hacking”,其实就是在深入理解1个系统的基础上,用最小的代价改变这个系统来到达自己的目的。“Hacking”之所以看起来出人意料,就是由于理解越深入,需要的做的改动越少。如果理解不深入,那就要从头造1个系统了,那就不聪明了

 

回答者:丁盛豪,网络媒体HeckPsi.com开创人

 

对编程能力这个问题其实我也想过很久,这个东西确切非常难界定。单纯靠算法水平、编程速度、工程经验都很难说是编程能力。

 

虽然这个东西的影响因素非常庞大,但从我平常的工作来看,其实我觉得衡量编程水平最靠谱的方法是视察这个程序员 Debug 的能力。

 

程 序从本质上来讲就是 输入 -> 处理 -> 输出 的进程,而中间的处理就像是1个巨大的黑盒子。而这个黑盒子的本身就是程序,在大多数情况下你其实不能看到这个黑盒子的全貌。从常识上写1个不存在 bug 的程序是1件 几近 不可能完成的任务。即便是敲个最简单的 Hello World 程序,你也很难保证编译器不给你抽几下风。特别是当这个程序变得非常庞大时,写程序这件事的本身就是 盲人摸象 的进程。程序员必须要有相当好的 全局观 ,才能保证自己的程序良好运行而不出问题,并能在出了问题以后能够做出迅速的定位和修复。

 

所以视察1个程序员能否 迅速Debug 的进程就是1个很好的判断根据。我举个例子来讲,我几周前给手机刷了机,第2天早上准备去晨跑,发现手机 GPS 不工作。因而我立刻分析了出现问题可能的地方:

 

GPS 模块硬件 -> GPS 驱动 -> 系统配置 -> GPS 权限 -> 软件兼容性

 

由 于想起刚刷了机,基本可以排除硬件问题。而软件之前一样在其它 Android 5.1 机器上跑过,同时跑了下 Google Maps 也不能定位,排除兼容性问题。原生系统的权限系统非常简单,基本排除是权限。出问题的多是第3方 ROM 的驱动有问题或配置文件。视察到 A-GPS 基站辅助定位也不工作,基本排除 GPS 驱动问题。确认是配置文件有问题,检查 /etc/gps.conf 竟是空文件。因而就在手机上用文本编辑器顺手码了1段配置,重启后问题修复。

 

这就是1次非常流畅准确的对1个未知的 Bug 定位和修复的进程。

 

由 于 Bug 的未知性,可以很好避免1些你在判断时可能遇到的 做弊 情况,我们知道现在很多人为了面试无所不用其极。就算是之前非常经典的面试问题,现在也很不靠谱。现在你问 “如何理解面向对象编程?” 和你对答如流的人可能其实不真正理解 OOP,不过背的很熟而已。之前觉得算法是个很好验证水平的切入点,自从 LeetCode 背题流的出现,这招现在也不怎样靠谱。而 Debug 是个没法 提早准备的东西,所以对编程能力的校验通常很准确。

 

而 且,Debug 的进程中会接触到自己很多不熟习的知识。由于编程本身就是1个 Engineering,正常的进程就是在 码字 -> 出问题 -> 学习 -> 修改 的进程中循环。如果你对算法不熟习,那末遇到程序性能问题的时候你硬着头皮也要用学习算法知识来解决掉。所以这是1项非常综合的能力,是程序员 知识、智力、经验 的综合体现。

至于如何提升编程能力?

多写、多错、多学。没有捷径,捷径只不过是做弊。做弊能帮你找到工作,但其实不能真正解决问题。

 

回答者:陈浩骏,call me Reid / 会写Java的猴子

 

MIT算法导论第1堂课:

 

每天都编程 x年后1定会变成专家 (忘了x多少 不是重点


轮子多造多模仿 能力自然提升
甚么发展都是从量到质的 要相信

现在我也是弄系统编程 除看source code和造轮
也是可以有空刷刷acm的
而且只有帮助没有坏处喔
系统编程1旦斟酌到效能问题 离不开经典的1些算法的 

明显大部份的我们都不会成为高手如温赵轮

 

但是成为编程好手 进个好公司 钱多赚些 生活舒服些 应当是普遍程序员的共同目标

 

不要想太多 拼命code就是了

 

共勉

如此。

 

回答者:vczh,专业造轮子 https://github.com/vczh-libraries

 

都不知道宣扬不要重复造轮子的人是怀着甚么险恶的用心,原话明明是不要重新发明轮子。

 

这是甚么意思呢?就是说你要多看论文多看书,少抄代码。

 

回答者:达达,服务端程序员

 

程序员就是把人类的需求语言翻译成计算机语言的人,所以可以通用译事3难:“信、达、雅”。

 

回答者:Kim Leo

 

其实,搭网站,写MIS/CMS/ERP这些,就算是1行行的写代码,结果也只能是你的领域知识不断提升,对“编程能力”的提升没有多少的。就像是你根本没法解释在你写的系统中哪一个地方利用了动态计划1样。

 

所以相对来讲你所需要的是1些计算机科学内的领域知识。

 

还有,假设你写了代码要给他人看和给其他程序员用,应当就开始渐渐斟酌接口和设计了。

 

或你需要的是1本分析模式?

 

回答者:JX Consp

 

看看他人的轮子的形貌(主要是接口,其次是效力)以后自己造1个轮子

 

其实 STL 源码剖析 和 modern c++ design 不错,唯1问题是选择了 c++ 做教学语言

 

有兴趣可以学点认知和设计来了解好的接口长得是怎样的

 

回答者:海涛,软件开发需要低本钱、快速响应

 

第1层:能做成东西(能运行)

第2层:做的东西能长时间或高负荷地运行
第3层:做的东西能长时间在高负荷下运行
第4层:能预先知道甚么才是客户/行业需要的功能,并以最符合的代价(金钱、硬件、期限、人力)实现

 

回答者:DreamPiggy

 

多看书

多思考

改他人代码
学他人的架构
做自己的软件
写自己的架构

也许如此循环就入坑了吧。


转载请注明本文出处:http://www.infocool.net/kb/EnterpriseInfo/201606/157624.html

编程 能力
------分隔线----------------------------
------分隔线----------------------------

最新技术推荐