还在读书,也在实验室协助做了些东西,自个也搭过几个网站。在周围人看来如同如同我很厉害,做了那么多东西,可是我发现这些东西尽管是我做的,可是实际上我手把手自个写的代码却并没有多少,许多都是用开源的东西,我写的代码无非是把他人的东西结合下,相似于胶水相同的作业。
我之前所认为的编程是全手动一行一行敲代码,可是如今我发现哪怕是工程上也有许多人是仿制黏贴来处理疑问的,并且发起不要重复造轮子。
可是靠谷歌和仿制他人的轮子,尽管我做出了许多东西,可是我并不觉得自个才干上有进步,却是使用搜索引擎的才干的确进步了不少。而校园里别的一波搞ACM的人,他们天天刷题练算法,或许却是的确进步了点编程才干,可是对工程简直一无所知。
所以我如今就很迷惑,所谓的编程才干究竟是啥,我该如何进步自个的编程才干?
回答者:刘贺,...
十分好的一个疑问。这也许是我在知乎见到过的问编程有关的疑问中问得最佳的一个了。我十分喜爱这个疑问。
核算机科学有两类底子疑问。一类是理论:算法,数据结构,杂乱度,机器学习,形式识别,等等等。一类是体系:操作体系,网络体系,分布式体系,存储体系,游戏引擎,等等等等。
理论走的是深度,是在诘问在给定的核算才干束缚下如何把一个疑问处理得更快十分好。而体系走的是广度,是在诘问关于一个实际的需求如何在许多的技能中计划出最多快好省的技能组合。
搞ACM的人,只练第一类。像你这么的更倾向于第二类。本来挺可贵的,但很可惜的是第二类才干没有简略高效的丈量调查办法,不像算法和数据结构有ACM比赛,所以许多体系的苗子都因为短少鼓励和正确引导渐渐就消隐了。
所以比尔盖茨才会说,看到如今学编程的人常常都把编程看作解各种脑筋急转弯的疑问,他觉得很惋惜。
做体系,的确不发起“重复创造轮子”。但留意,是不发起“重复创造”,不是不发起“从头制作”。恰恰相反的,我认为,体系的编程才干正体如今“从头制作”的才干。
能把已有的部件接起来,这极好。但当你刚好缺一种要害的胶水的时分,你能写出来吗?当一个已有的部件不完全契合你的需求的时分,你能改善它吗?假设你用的部件中有bug,你能把它修好吗?在网上繁复的相似功用的部件中,谁好谁坏?为啥?不相同实质吗?一个开源代码库,你能把它从一个言语翻译到另一个言语吗?从一个渠道移植到另一个渠道吗?能精确估量自个翻译和移植的进程需求多少时刻吗?能精确估量翻译和移植以后功用是会有进步仍是会有所降低吗?
体系编程才干体如今把已有的代码拿来并变成十分好的代码,体如今把没用的代码拿来并变成有用的代码,体如今把一个做好的轮子拿来能画出来轮子的计划计划,并用道了解释出计划计划中哪些当地是要害的,哪些当地是非有必要的,哪些当地是不容触碰的,哪些当地是还能够改善的。
假设你一点不明白理论,仍是应当学点的。关于体系功用的计划上,算法和数据结构就像在自个手头的钱相同,它们不是全能的,但不明白是万万不可的。
如何进步体系编程才干呢?土办法:多造轮子。就像学画画要画鸡蛋相同,不是这国际上没有人会画鸡蛋,但画鸡蛋能征服手指,感触暗影线条和笔触。所以,自个多写点东西吧。写个编译器?渲染器?操作体系?web服务器?web浏览器?部件都一个个换成自个手写的,然后和已有的现成部件比一比,看看谁的功用好,谁的易用性好?好在哪儿?差在哪儿?为啥?
更聪明一点的办法:多拆轮子。多研讨他人的代码是如何写的。可是这个实习起来常常很难。缘由:大多数工业上用的轮子也许计划上的思维和技能是好的,都计划和制作进程都很烂,里边乱成一团,让人乍一看毫无条理,致使其对菜鸟来说十分难拆。这种状况本来十分差劲。所以,此办法一般只对比较简略的轮子好使,关于杂乱的轮子,请力所能及。
轮子欠好拆,本来是一个十分严峻的疑问。重复创造轮子固然是时刻的糟蹋,但当轮子杂乱而又欠好拆的时分,尤其是本来造轮子的人现已不在场的时分,从头创造和缔造轮子往往会变成无法之下最佳的挑选。这是为啥工业界在明知道重复创造/制作轮子十分欠好的状况下还在不断重复创造/制作轮子的底子缘由。
程序实质是逻辑演绎的形式化表达,记载的是人类对这个国际的数字化了解。不能拆的轮子就像那一篇篇丢了曲谱的宋词相同,能读,却不能唱。
不才不才,正在自个研讨如何计划缔造一种既好用又好拆的轮子。您没那么走运,恐怕是等不到不才的技能做出来并发扬光大了。在那之前,多造轮子,多拆好拆的小轮子,应当是进步编程才干最佳的办法了。
以上。嗯。
(文章属个人观点,与自个作业雇主无关。)
回答者:mu peng,less is more
懂得取舍。
在有限的时刻内,简直没有体系能够做到完美。要快,要安全,高并发,易拓展,功率高,简略读,高内聚,低耦合...
大到一个网站,小到几个class,工程师都要明白,要取啥,舍啥,这并不是那么简略的事。咱们都有自个的性情,有的求新,有的求稳,有的求快,但详细到一个项目时,知道如何取舍对这个项目最佳,很主要。
校园里的作业,没人介意你是不是写在一个大的main()里边,能跑就行。但做项意图时分,太多的东西要考虑,有时分,宁可简略易读,也不必快那么一点点;有时分,要做太多看不到的作业,却一点点大意不得;有时分,写了不如不写,留白也是一个学识。
从前接手个项目,里边简直一切的class,每个都有interface,各种承继,各种完结,理由是灵活性高,易拓展。真的易拓展吗?
我不知道。没多久,客户的需求就改了,各种拎不清的承继完结都荡然无存,一大半要重写。
疑问在哪里?
不是编程欠好,而是取舍的欠好。在那个期间,为30%的需求,花200%的尽力,寻求计划的滴水不漏,却放弃疾速完结,获得反应的机遇,这即是失误。需求总会变,客户看到越早,修正越早,影响越小。
很聪明的人,也也许做出很难用的体系,纷歧定是编程欠好,也许是不肯,或不屑于取舍。不相同的期间,不相同的项目,要取舍的东西也不相同。编程仅仅手法,意图是处理疑问,才干高不高,要看疑问处理的好欠好。不在于使用了啥高端算法,或是杂乱的结构。
懂得如何取舍并不简略,需求对疑问的深入了解,对技能的胸中有数,和死后无数个踩过的坑。但主要的是有取舍的认识,主动考虑取舍啥,这么学的才会快。
回答者:李遥,A Programmer
已然说的是编程才干,那首先就先把学术有关的才干扫除才干说的明白
接下来是我对编程的界说:所谓编程,即是预先计划好计划来指挥行动可猜测的体系来主动(与暂时手动相对)到达的想要的成果。从广义上说,企业家对一个公司的运作办法进行计划,然后这个公司主动运转发生赢利也是一种编程
那么编程才干体如今两点
1.对可猜测体系的了解:了解越深,猜测才干越强,自个的才智才越好表现。这即是为啥学习软件编程最快的办法之一是“造轮子”
2.如何把自个的方针转化成指挥计划,这本来即是“做应用题”的才干,咱们从小学就在操练这个才干。实际国际的应用题可不会通知你用啥常识点去建模,也不会泄漏悉数必要条件,因而增强这个才干需求深入了解实际国际的运作办法。在软件职业,这被称作“了解笔直职业的事务逻辑”
顺带说一下,所谓“Hacking”,本来即是在深入了解一个体系的基础上,用最小的价值改动这个体系来到达自个的意图。“Hacking”之所以看起来出其不意,即是因为了解越深入,需求的做的改动越少。假设了解不深入,那就要从头造一个体系了,那就不聪明晰
回答者:丁盛豪,网络媒体HeckPsi.com创始人
谢 @花满楼 约请。
关于编程才干这个疑问本来我也想过好久,这个东西的确十分难界定。单纯靠算法水平、编程速度、工程经历都很难说是编程才干。
尽管这个东西的影响要素十分无穷,但从我平时的作业来看,本来我觉得衡量编程水平最靠谱的办法是调查这个程序员 Debug 的才干。
程序从实质上来说即是 输入 -> 处理 -> 输出 的进程,而中心的处理就像是一个无穷的黑盒子。而这个黑盒子的自身即是程序,在大多数状况下你并不能看到这个黑盒子的全貌。从常识上写一个不存在 bug 的程序是一件 简直 不也许完结的使命。即使是敲个最简略的 Hello World 程序,你也很难确保编译器不给你抽几劣势。尤其是当这个程序变得十分无穷时,写程序这件事的自身即是 盲人摸象 的进程。程序员有必要要有相当好的 大局观 ,才干确保自个的程序杰出运转而不出疑问,并能在出了疑问以后能够做出敏捷的定位和修正。
所以调查一个程序员能否 敏捷Debug 的进程即是一个极好的判别根据。我举个比如来说,我几周前给手机刷了机,第二天早上预备去晨跑,发现手机 GPS 不作业。所以我马上分析了呈现疑问也许的当地:
GPS 模块硬件 -> GPS 驱动 -> 体系装备 -> GPS 权限 -> 软件兼容性
因为想起刚刷了机,底子能够扫除硬件疑问。而软件之前同样在其它 Android 5.1 机器上跑过,一起跑了下 Google Maps 也不能定位,扫除兼容性疑问。原生体系的权限体系十分简略,底子扫除是权限。出疑问的也许是第三方 ROM 的驱动有疑问或许装备文件。调查到 A-GPS 基站辅佐定位也不作业,底子扫除 GPS 驱动疑问。确认是装备文件有疑问,查看 /etc/gps.conf 竟是空文件。所以就在手机上用文本编辑器随手码了一段装备,重启后疑问修正。
这即是一次十分流通精确的对一个不知道的 Bug 定位和修正的进程。
因为 Bug 的不知道性,能够极好防止一些你在判别时也许遇到的 做弊 状况,咱们知道如今许多人为了面试无所不必其极。就算是曾经十分经典的面试疑问,如今也很不靠谱。如今你问 “如何了解面向对象编程?” 和你对答如流的人也许并不真实了解 OOP,不过背的很熟罢了。曾经觉得算法是个极好验证水平的切入点,自从 LeetCode 背题流的呈现,这招如今也不如何靠谱。而 Debug 是个无法 提前预备的东西,所以关于编程才干的校验一般很精确。
并且,Debug 的进程中会接触到自个许多不熟悉的常识。因为编程自身即是一个 Engineering,正常的进程即是在 码字 -> 出疑问 -> 学习 -> 修正 的进程中循环。假设你对算法不熟悉,那么遇到程序功用疑问的时分你硬着头皮也要用学习算法常识来处理掉。所以这是一项十分归纳的才干,是程序员 常识、智力、经历 的归纳表现。
至于如何进步编程才干?
多写、多错、多学。没有捷径,捷径只不过是做弊。做弊能帮你找到作业,但并不能真实处理疑问。
回答者:陈浩骏,call me Reid / 会写Java的山公
MIT算法导论第一堂课:
天天都编程 x年后一定会变成专家 (忘了x多少 不是要点
轮子多造多仿照 才干天然进步
啥开展都是从量到质的 要信任
如今我也是搞体系编程 除了看source code和造轮
也是能够有空刷刷acm的
并且只要协助没有害处喔
体系编程一旦考虑到效能疑问 离不开经典的一些算法的
明显大多数的咱们都不会变成高手如温赵轮
可是变成编程能手 进个好公司 钱多赚些 日子舒服些 应当是遍及程序员的一起方针
不要想太多 拼命code即是了
共勉
如此。
回答者:vczh,专业造轮子
都不知道宣扬不要重复造轮子的人是怀着啥险峻的用心,原话分明是不要从头创造轮子。
这是啥意思呢?即是说你要多看论文多看书,少抄代码。
回答者:达达,服务端程序员
程序员即是把人类的需求言语翻译成核算机言语的人,所以能够通用译事三难:“信、达、雅”。
回答者:Kim Leo
本来,搭网站,写MIS/CMS/ERP这些,就算是一行行的写代码,成果也只能是你的范畴常识不断进步,关于“编程才干”的进步没有多少的。就像是你底子无法解释在你写的体系中哪个当地应用了动态计划相同。
所以相对来说你所需求的是一些核算机科学内的范畴常识。
还有,假设你写了代码要给他人看和给别的程序员用,应当就开端渐渐考虑接口和计划了。
或许你需求的是一本分析形式?
回答者:JX Consp
看看他人的轮子的描摹(主要是接口,其次是功率)以后自个造一个轮子
本来 STL 源码分析 和 modern c++ design 不错,仅有疑问是挑选了 c++ 做教育言语
有爱好能够学点认知和计划来了解好的接口长得是如何的
回答者:海涛,软件开发需求低成本、疾速呼应
第1层:能做成东西(能运转)
第2层:做的东西能长时刻或高负荷地运转
第3层:做的东西能长时刻在高负荷下运转
第4层:能预先知道啥才是客户/职业需求的功用,并以最契合的价值(金钱、硬件、期限、人力)完结
回答者:DreamPiggy
多看书
多考虑
改他人代码
学他人的架构
做自个的软件
写自个的架构
或许如此循环就入坑了吧。(文章来自南京欣才PHP培训机构)