WARNING: Do Not Use An IDE 黑的漂亮
发布于 9 年前 作者 i5ting 5340 次浏览 最后一次编辑是 8 年前 来自 分享

http://c.learncodethehardway.org/book/ex0.html

WARNING: Do Not Use An IDE

An IDE, or "Integrated Development Environment" will turn you stupid. They are the worst tools if you want to be a good programmer because they hide what's going on from you, and your job is to know what's going on. They are useful if you're trying to get something done and the platform is designed around a particular IDE, but for learning to code C (and many other languages) they are pointless.

虽然这是一篇关于c的内容,但有借鉴意义,哇哈哈,黑的漂亮

28 回复

你最近很闲啊,灌这么多水

此文一点也不水,说到了重点,我当年用微软了IDE,c一直都没入门,后来转到linux,一下子就开窍了。我的经历证明,IDE使人变傻,微软需要傻瓜,有的人也愿意做傻瓜,当然现在越来越多的傻瓜醒悟了,我就是那个醒悟了的傻瓜。

我现在用vim,随便搭了个适合自己工作的IDE,我又把自己变成傻瓜了,不过总比让别人把自己变成傻瓜要好得多。

做开发最好还是转到linux, 不管是前端还是后端。

linux一个make搞定的,在windows下要付出太多了,比如node-canvas,非常好的图像库,比gm,im好多了,可惜在windows下编译很困难。

@coordcn 一方面说ide让人变傻 微软需要傻瓜 另一方面又说linux 一个make就搞定, windows 要付出太多

傻瓜化的东西,不正是所谓“一键搞定” 这种东西么

@chita 此傻非彼傻。。。你再好好读读楼主的文字,会有所体会的。

人总是想偷懒的,但是一种办法是自己不思考,直接拿来别人的来用,微软就是这样不希望程序员思考的,很多东西都包装好了,短期开发效率很好,但个人进步很小。另一种是自己思考,用工具链来做事情,我说一个make,但不管是别人还是自己,都需要随着项目的推进,改变makefile,这个过程是用ide能比的?我现在用gyp,很多东西要自己写,这个过程需要学习摸索,但总有苦尽甘来的时候,现在一个命令,是以之前的努力做基础的,这个里面的区别我想你应该能明白。

我不清楚现在大学里的计算机教育怎么样了,我们那会整天VC,到最后C和C++没学到,反倒觉得VC是门语言了。我个人认为大学应普及linux,只有在linux下才能真正获得纯粹的编程训练,抛开一切工具,回归本真。不但是学计算机的,其他理工科的也应以linux为基础,windows扼杀了多少天才我们不得而知,但我们计算机教育质量不乐观也是事实。

我觉得对于新手而言IDE是最好的工具,可以让他不必去在环境和工具上花费太多功夫而专注于自己的代码,在初学阶段这是很重要的。

我自己也用了很长一段时间IDE,现在我不再用IDE是因为IDE虽然内置了一些工具,但是有的功能相对较弱,而有的插件或者工具我又不需要,而我又想用些IDE没有集成的工具来工作。冲突太多,后来就放弃了。

@coordcn 是在windows虚拟机里跑linux么?

@chapgaga 有条件的三台计算机,windows,macos,linux一台一个系统,工作,娱乐,测试三不误。

没条件的,要么多系统,要么虚拟机。总之不能一直蹲在windows里,这样的程序员是有缺陷的,到了一定程序想继续提升很难,系统和工具链的天花板被限死了,微软当然希望这个结果,大家帮windows写一辈子代码,但windows能不能比我们活得长还是未知数呢。对编程有追求得程序员,必须要能玩linux。毕竟这个系统是开放的,能够接触到的底层东西比较多,实在不明白的,源代码看一下,心里就有底了。

@faceair IDE提供方便的同时,也会有误导,前些年微软搞的webIDE还有控件什么的,现在不知道还有没有了,这些害人的控件不知道坑了多少初学者了。如果学web编程,不管前后端,最好的入门编辑器就是记事本,高级点用vim,足够了。web编程很简单,语法熟悉下,API浏览下,有点基础的就能干活了。新手要那些IDE干什么?越重型的IDE越坑人。新手顶多去弄点带代码提示的就行了,微软那种过渡包装的反正千万不要碰,我是深受其害,深恶痛绝的。

我现在用vim,配置好了写程序,编译,错误提醒,一步搞定,不比IDE差多少。代码提示什么的也够用,代码索引都可以。就是搭建的事件稍微长,搭建完了是越用越舒服。

@coordcn taglist在你经常用么? 为何每次需要:TlistAddRecursive, 而且这个过程很慢 你有3台电脑么?维护三台电脑太麻烦了吧

@chapgaga 我没用taglist,我用的是NERDtree+ctag+neocomplcache,配置很简单,反正是够用了。

基本不需要维护,我两台,没mac,一台单系统,一台双系统。单系统里面做一些VB,C#反编译工作,这些都是行业用的软件,其他的现在基本都在linux里面。

我今年刚刚实习吧 公司就要用vs2015 我自己在家里都一般用notepad的 有些时候用点android studio和webstorm,不过这个其实都还好了 现在大学都还在用vc6呢 连IDE都不舍得升级- - .net也一直还在教 我倒是在选了cpp之后还是去选了j2EE

@chapgaga


"taglist
let Tlist_Ctags_Cmd='/usr/bin/ctags'
let Tlist_Show_One_File=1               "只显示当前文件的tag
let Tlist_Use_Right_Window=1		          "在左侧窗口显示
let Tlist_File_Fold_Auto_Close=1
let Tlist_Process_File_Always=1 "实时更新tags
nmap <F5> :TlistToggle<cr>
map <F10> :!ctags -R -f /home/public/github/links/out/tags --c++-kinds=+p --fields=+iaS --extra=+q .<CR><CR> :TlistUpdate<CR>
set tags=tags
set tags+=./tags
set tags+=/home/public/download/tags
set tags+=/home/public/github/links/out/tags

这是我现在的设置,我原来配置了,忘记用了,我左边是NERD_tree,右边是Taglist。我滚了一年多的鼠标特么要浪费多少时间,感谢提醒。

@wenshiqi0 都是误人子弟的,按照我的理解,c才是基础中的基础,计算机体系,操作系统,算法加强一下,就基本上合格了,其他语言都可以自学。大学里不把c学好,还不如上培训班。没有这个基础,自我扩展就很难。当然很多人不同意我的观点,认为自己c不精通,也照样混得不错,照样拿高工资,当然,你现在的确可以这样,但你也只能这样了。这种类型的反正也没准备做很长时间的技术,属于技术上没追求的,但可能在其他方面会成功。恰恰是这种现象印证了我们计算机教育的浮躁和失败,国内很少有团队愿意去做底层的东西(印象中也只有新郎和淘宝在做),都是在跟风,缺乏自己原创的东西,开源氛围和质量都不行。

如果做web的跟微软混的公司不会有前途的,做其他可能还可以混混,微软自己就混成那样,它做的工具能帮到其他人?充其量就是个大号AutoComplete。微软缺乏互联网的开放思维,其工具还停留在桌面时代,用多了思维就被束缚住了。

@coordcn 多给大家普及一下,功德无量

嗯,150前排兜售webStorm 激活码.

@coordcn 我可能没有说的很清楚 我写c还是写了很久的 从高中就开始了 用android的linux接口来编译和运行 我自己也很喜欢底层 自己也在想努力写一个操作系统 在虚拟机上运行 我自己也还学过opengles和dx 但是这些太难找工作了 我之前一直都是不喜欢html和js的 都是公司要求现学的 只能公司要求什么就坐什么吧 我自己其实还是想在c和汇编上面做点事情的 我现在用nodejs其实都没有用c那么自信 不过生活和理想还是不一样

@wenshiqi0 可能我没写清楚,我提到c,不是对你,是对我们的大学教育,还有一些宣扬不需要了解底层的人。

我的意思可能会给人误解,我不是开语言炮,不是说就c好,其他语言不好,语言都有优缺点。而是希望大家有c的基础,再去搞其他的就轻松多了。就像你如果有c基础,nodejs有疑问的直接看源代码,比其他人就有优势多了。

node的优势现在已经慢慢减弱了,回调模式下的异步对node发展将是巨大的阻碍,javascript语言本身也意识到了这个问题,在语言层面打了一些补丁,es6 promise/generator/yield,es7 async/await,虽然es6才刚刚普及,但是去回调肯定是大势所趋,但javascript这种方式还不够彻底。我认为异步关键字都可以去掉,可以实现让程序员用同步代码写异步程序,我用libuv + lua5.3已经做出了原型,性能上不比node差,但可以用同步代码实现异步程序,lua和javascirpt是很类似的语言,语法上的转换时间不要三天,看看文档个把月就能熟练,lua与c底层的结合也比javascript简单,如果性能上想更进一步,移植到luajit也不是难事。

@coordcn 大学还是会教c 但是基本还是停留在语法上面 指针之类的都被尽量的避开了 所以我的c都是免听了的 不过大学本来就是这样 我自己能自学就够了

曾经有一群疯狂的年轻骇客,他们只用汇编写程序。

@wenshiqi0 c语言的精华是什么?就是能够自由的操作内存,大学不能因为指针难就放弃吧,这等于没学。语法大家看看书就会了,自学就可以,这个不需要老师,也不需要上大学。那剩下的难点又不教,这大学上得还有意义么?这老师的存在还有意义么?老师存在的意义就是讲解难点的,当然一些老师自己都糊里糊涂的,更不要说去教学生了。教育本身应该是普惠性质的,如果所有人都可以自学学会,那还要老师做什么?你可以自学会,不但表别人可以,我也是自学的,我专业不是计算机的,我自学的过程碰了好多坑,尤其是微软的坑,所以我对微软深恶痛绝,都是些为了自己商业利益害人的东西,远不如在linux里清爽自然。这中间浪费的时间是太多了,我们不能否认一个好老师的作用。而我们很多大学却是在将大学办成培训班,甚至水平连培训班都不如,出现大学毕业先上培训班再就业的奇葩现象。

我认为大学教育应该普及linux,有条件的话,在小学就要普及,不仅仅是在计算领域,所有领域都要使用linux进行工作,如果这个政策强推下去10年,我们就会看到我们的信息技术人才的数量和质量水平会有个大提升。大学里教学还是用什么VC,IDE很容易把初学者搞晕了,最后失去实践的动力。linux下写程序,打命令,编译成功,比IDE要直观多了。计算机编程是一门实践性很强的专业,没有实践,光看书,哪能理解什么指针。指针的理解是被各种内存错误敲打出来的,是血淋淋的教训换来的。实践老师帮不了,但是老师可以给学生创造实践的机会,各种内存错误操作全过一遍,坑全跳一遍,不是会了么?说什么指针难就不学都是借口,有的人是不想学,有的人是没碰到好老师,有的人是想学,没那个天分,碰了好多钉子之后才能醒悟。

一个开放的系统才能让人更高效的学习编程(各种源代码参考,linux内核链表现在成了我的最基础的数据结构,这个链表设计的如此巧妙,如此通用,在windows下的程序员能有这种享受?),IDE很可能是初学者的坟墓,linux绝对是首选,希望国家能够重视起来。普及linux,从你我做起,娱乐,所有系统都可以,工作,linux是首选。

@coordcn 中国教育不只是大学和老师的问题 学生和家长也都很多人有问题 很多人选这个系都是因为想去这个学校而已 我班上很多人都是不准备做这个的 每年那么多这方面的学生可是只有很少一部分是能出来有兴趣的 中国的大学不敢让大多数人不过的 不是老师不愿意 很多时候他们也是必须这样去教 当然还有一部分老师已经商业化了 其实自己都已经不是很会了 不管怎么说 在中国做技术 我认为还是要个人 我以前什么社区和网上的讨论都不去的 都是自己看书和查资料 开源和交流我现在才逐渐了解到了的兴趣在这之中占了不少比例 我这个人很懒 但是会因为写程序大晚上睡不着 其实只是一种热爱 不只是计算机 中国如果能够多让学生往兴趣发展 即便是可能老师不能教太多 但是同学之间还是能够进步的

@MiguelValentine 不是开语言炮,而是希望我们的计算机教育重视基础,重视C语言,不是用C语言去否认其他语言,每个语言都有优缺点,都有适用的领域。

也不是开系统炮,我认为linux更适合编程学习和工作,希望国家普及,这对我们提升信息化水平是非常有利的。我们现在很多编程教育都在windows各种IDE里做的,学的都是皮毛,微软的IDE太过人性化了,包装隐藏了太多,很容易让人迷失编程的本正。

还有面向对象,设计模式,有些人言必面向对象,设计模式,这些东西的确是好东西,但有的人把这些东西当成了锤子,看见钉子就往里面钉,基础不牢靠,搞这些没用。把基础打牢靠了,这些东西都是水到渠成的事情,看看libuv的代码,各种handle继承不要太华丽。我们的计算机教育还是要回归最根本的东西,要重视基础,要用开放的系统来教编程。

@wenshiqi0 的确,不仅仅是老师的问题,而是大家都有责任,像我们这样有兴趣的很少。但由于现有的教学方式,也埋没了很多人。一个好的老师可以成就一个人,兴趣的本质是入门了,觉得自己比较行,自然就会投入更多的精力。我们现在的教育问题当然是多方面的,不能因材施教,人尽其才是一方面,没有很好的引导机制也是事实。如果一些教学的老师,自己很精通,先让学生入门了,有了一定的成就感,然后继续深入,适度的让学生踩一些坑,这样慢慢的潜移默化的就把老师自己的经验通过各种坑传授给了学生。这个过程再辅以一个小项目,很多人都可以进入状态了,这样对那些摇摆的学生,就可能争取到一部分。这样的老师有,但太少了。现在很多学生抱怨在学校里学不到东西,老师还是要承担责任的,因为这种抱怨是普遍的。学生中有聪明的,不需要老师教,自己能全学会,自己有兴趣钻,这种人不会抱怨。对于大多数人,像我这样的,需要有点点拨的,一个好老师就能起到事倍功半的效果,还好我有兴趣坚持了下来。另外一部分是没有兴趣的人,这样的人本来可以引导一部分的,结果老师的教学方式使这部分人放弃了,而真正对自己的不负责任,完全不想学的人毕竟是少数,这个人数可能跟特别聪明的那部分相当。老师的作用就是带动有兴趣没资质或没兴趣但不抗拒的人入门。这就是我觉得老师有责任的原因,我认为这个根本原因是我们从小使用的系统导致了一部分人对编程缺乏直观的认识,没有入门,自然就谈不上深究了。很多人过来学习了,结果还被各种IDE给坑到放弃了,所以我认为从小就用开放的系统,培养编程意识是很重要的。国外有很多年少的天才,他们语言优势是一方面,系统优势才是最主要的,用linux,一些问题必须要设计的编程的东西,举个例子,同样在是重新装系统,windows转100编也碰不到编译的问题,linux装玩系统各种工具就有可能需要自己编译,这样潜移默化的能力就形成了,一些人就慢慢的深入了,兴趣就培养了。这就是我强调学计算机的人必须要用linux的原因,这里面有各种代码可以参考,这个我们必须要面对。我们现在信息产业看似很大,但我们人才并不是依靠良好的高等教育,而是依靠巨大的人口基数下巨大的有兴趣的人。如果我们能够建立起比较科学的计算机教育体系,我们的人才体系将迅速膨胀,有了稳定的高端人才来源,这个产业才能真正强大。

就如你所言,找一个可以交流的人都很难,我现在做的事情,很多人也是不相信的或者不屑的,他们不认可形式同步,认为异步模式天生就是回调模式,回调模式也是很自然的,我却是反回调的,我不但反回调,我反任何显式的异步关键字,我认为最终的异步程序是可以用同步代码来编写的。上个礼拜碰到一个bug,昨天刚过了,我是没想到libuv里,uv_timer_t也是个handle,也是要通过uv_close释放的,我把uv_tcp_t和uv_timer_t放在同一个struct里,释放了uv_tcp_t,却没有释放uv_time_t,由于所有的handle在uv_handle_init()的时候都通过链表串到loop->handle_queue,这样没有释放的uv_timer_t的handle_queue,但释放struct内存的时候,uv_timer_t上的handle_queue还被其他handle链接着,当我释放其他handle的时候,从链表删除的时候就访问了已经被释放的内存,结果就出现了各种莫名其妙的错误。如果有人交流的话,也许就不需要耗这么长时间了。

刚才做了个压侧,裸socket大约是node1.5倍,我在近期会放出源代码,有机会一起交流。

@coordcn 说实话我在web开发这块 挺弱的 今天做框架 说实话我很多东西都没有怎么用过 我都是偏桌面的 用koajs做一个rest风格的后台 我对html模板都不是非常理解 努力吧只有

@wenshiqi0 静下心来看,我把大部分流行的模板源代码都过了一遍,自己实现了个类似jade的,能够模板继承,但不是实时编译的,做成实时编译缓存的也不难。我做的模板效率跟doT.js差不多,比ejs快很多,jade就更慢了。

你这个问题就印证了我的观点,容易被桌面束缚住,搞web,源代码都是透明的,看源代码就是了,各种模式如何实现的,一目了然,低级点的都是字符替换,高级点的带点语法解释,语法解释也是简单的Stack数据结构,从头到尾巴一层层把一行行模板push进去,然后一层层pop出来字符拼装成一个function,这个function就是编译结果,每次传给function参数就是提供给模板的数据,function运行返回html,大致就是这个过程。

@coordcn 我要用swig来做 这个东西能多继承嘛

@wenshiqi0 我对swig不熟悉,自己试验。

我觉得不需要多继承啊,网页就从一个根上过来的,在根类上框架搭好了,其他子类对根随便改变,大体框架在根上就建立好了。这样不同子页面不就建立起来了么?我不清楚什么情况下要多继承的。从根被继承后分化出子页面,子页面还可以被子子页面继承,都能继续改写下去的,我的实现就是用javascript继承实现的。

你有兴趣的话可以看我实现的代码,这个项目我没完成,现在我主要在编写libuv+lua实现形式同步的验证程序,所以暂时搁置了。我个人认为我的想法是比较有意思的,实现类似jade的语法,但做了适当的简化,继承机制利用了javascript继承实现了,比如容易理解,效率上也跟顶尖的能打个平手。你如果有兴趣可以继续后面的工作,按照你的需求改进下,做一些测试,可以直接拿去用。

https://github.com/coordcn/sml

这个只是服务端的实现,客户端要实现类似seajs的异步加载,还要做不少工作,所以就只能先搁置了。

回到顶部