五千年(敝帚自珍)

主题:【原创】编程心得 -- 荆棘探兴

共:💬198 🌺258
全看树展主题 · 分页首页 上页
/ 14
下页 末页
家园 您的题太难了.说实在的,在美国面世人,

能把stl(map啥的)实现说个大概的已经是高手了,能说清一些boost的实现的简直就是神人。你这题看来简单,但真的写一个string的函数,三十分钟后保证写的和GCC里的实现差不多(至少要素都考虑到了)的人是很少见的。

我猜美国70%的职业C++程序员没有认真读过stl的实现。其实那是个很好的练习。

家园 类库及框架以及最佳实践,这些是需要功力,但语言的

某些特性的灵活运用有时候也需要功力和灵感,既然各种语言各不相同,那不相同的语法和关键字就代表了语言创作者对程序设计思想的不同理解,所以各种语言还是有些不同的。

家园 很欣赏其中关于自然语言和计算机语言的比较

Probably the next interesting thing is a computer language that is very close to natural language.

现在很想找到一种比较接近自然语言的计算机语言。不知您或河里

的大牛们是否了解?

家园 捉个虫

俺记得教材的作者不是唐浩强,是谭浩强

家园 俺的发展途径是汇编-C-JAVA

现在正在啃erlang和scala

家园 多年前炒过的4GL(第四代语言)就是

不过始终没有成为主流,现在SQL Server和Oracle等数据库上的仿自然语言查询就是从4GL进化来的,其实很大程度上也是个鸡肋。

个人认为,让计算机理解自然语言可能是个不可能完成的任务,因为自然语言(很可能)本质上是不可计算的,至少是现有的所有计算机器(包括理论上和现实中的)所不能计算的。

家园 如果学习的话,个人觉得还是Scheme或者MOZART好

更接近计算的本质,而且有很好的教材配套。特别是Mozart(OZ语言的一个实现),可以模拟各种编程模型,从函数式到命令式到面向对象,甚至逻辑编程全有。

类似C、Java之类,更偏向於实际应用,其教材和大牛们的书也是偏向实际工程,对计算的原理反而不是很重视。

家园 你。。。你入门语言学的是汇编,然后学C,然后Java.

太凶猛了,怎么从最难的开始学啊,不花一下,对不起自己的良心

我当时,是从最简单的QBASIC开始的,哈哈,现在汇编,也只能写点简单的16小程序

家园 所谓纸上谈来终觉浅

这个结论很早就看过,只是觉得很虚,很形式。但事实上当有一天突然又想起这些分析的时候又觉得很有体会,但现在我仍然认为这句话很虚,可能是我理解仍然很浅,我觉得这个结论对解决我的问题帮助不大。

我现在最烦的是,编程过程中仍然有大量重复性的脑力劳动,无法用程序自动化,但每次东西都差不多,模式都差不多,就是这里改一点那里变一点,大量的底层支撑细节要处理;其实在看到一个需求的时候我脑子里已经有了一个设计,而且觉得自然而然就是这样的,根本就没啥特别有新意的东西嘛,但做的时候很快就淹没在细节里了,而且这就是我现在工作的主要内容。当然这可能是我现在做的东西都比较小(大部分在20K行代码以内),但一直就在想这个问题,既然计算机就是用来处理重复性劳动的,有办法解决这些复杂一点的重复性编程不?就算不能完全代替自然语言所能表达的内容,那能由人脑处理完关键信息后剩下都由编程解决不?为啥做一个不同的需求时,需要重新做的事远不止需求上的一点不同?一句话,我还是觉得现在的编程语言层次还是太低太低。

做为一个一线工人,我有个浅见,我觉得现在看到的东西里有个东西做得比较好,就是浏览器(浏览器还一个名字叫layout engine),在做UI布局方面,我觉得HTML/CSS的抽象层次就很高,基本上写出来的东西就直接对应着一个一个的需求,对大部分需求无细节或很少细节需要处理,不需要一堆if else,不需要计算来计算去,简单说,不需要为支撑需求做太多底下功夫,“哥做的直接就是需求”。最近我做客户端程序,写一些支撑库,布局(及各种各样的动态变化)和事件处理就是按浏览器思想来,用一个很智能但规则简单的东西满足各种各样的变化,解决了很多重复性劳动;现在看来的确省了不少事,但这还是只是大量重复性细节中的一小部分,而且是比较低技术层次的事,更不要说别的重复性劳动了,完全想不出该搞个啥库才好,要么写的库太specific,要么就太空或是不现实。有时候我想,这里可能就是我软件设计能力的顶了。

乱扯一通,希望与大家交流。

家园 我主要是在拿这些不同来说编程自动化的困难之处

至于编程语言,我就C++很熟,别的一些脚本语言特别是Linux下的常用的大部分都有用过,自我感觉有一点了解。但还远没有到那个高度去讨论编程语言的发展方向之类的大课题。只是最近经常加班,加班越多就思考越多,想咋解决这些重复性劳动,为什么不好解决,所以就写了一通,看看同行们有什么好建议。

家园 代码不断的变化是由需求决定的,对应用开发来说,不变的就是

变化本身,所以无论你一开始的抽象和设计有多完美,最后还是会被要求插入新的IF/ELSE,这个是无解的。当然,好的设计可以解决很多问题,而最好的设计就是发明一种新语言来解决问题了,这是最灵活的方式,这也是语言不断产生的原因。

浏览器本质也是由HTML语言及JAVASCRIPT语言来支撑的,而结果就是又产生了HTML及JAVASCRIPT的脚本程序员。拿你的那个客户端程序设计来说,如果你的所谓规则引擎越来越复杂,最后也需要专门的程序员来维护你的规则集,说白了,好的灵活的设计就是把变化推给别人,将自己的责任撇清,但这最后的结果就是让你从应用程序员变成了系统程序员了。看看开发操作系统和浏览器的家伙,他们一定没有你的这种体会,因为他们的程序基本不会再额外增加太多的IF/ELSE了,这些脏活累活都扔个上层的应用程序员了。

家园 关键问题是一个需求上的变化需要多少程序上的变化来支撑

如果需求变了,当然程序会变,但关键问题是一个需求上的变化需要多少程序上的变化来支撑。

尽管说当我脱离程序员这个层次之后自然不会碰到这样的问题,但就现在待在程序员这个层次讲,我觉得还是有很多地方可以改进的。

说回浏览器作例子,把界面上左右两大块内容块对调一下,这个需要在浏览器里做,用javascript+Jquery的话最多2行代码,用MFC的话,除非事先有防备有意做了这个的支持,否则代码的变化可能需要100行代码才能搞定的,内容块里的东西复杂的话更是如此。如果是内容进行动画变化(比如位置滑动,淡入淡出)之类的,用原始的MFC库+C++,一不小心代码行数就上千了。都是程序员,实现同样的需求需要做的工作量相差太远了。

再举几个服务器的例子,在我很有限的经历里,我见到的常见的问题是高并发量的网络访问,数据缓存/同步,服务器可靠性,等等问题,这些我觉得还算是比较高层一点的问题,比较底层的更偏向,实时监控和配置,诊断的方便性。如此种种,就我才几年的编程经历我都见过好几次,做了又做;这些我觉得都是可以在程序员层次解决的,但现实是没有。我看到的代码还是由C/C++库开始。可能我做服务器的时间太少,我还真没见过特别强大的可以解决这些方面各种需求变化的库。

现在一般的编程的本质实际上先建一个在程序上可以描述需求的模型,然后完成这个模型的所有细节。为了实现简单,这个模型往往是简化的,适用于非常特定的场景的。结果就是模型上的小变化需要重建几乎所有细节。因为我们每次建的模型太小太弱,一个自然语言描述的需求可以很简单,但背后很多细节被隐藏,因为自然界或者说是人可以随机应变,但程序如果真想做到这样的地步(即自动处理细节),这个模型会非常大非常全非常强,所有可能的细节全被程序处理了才行。在现有的条件下,一条路是越来越强大的硬件用以支撑非常大量的运算,另一条路是建立程序上简化但仍然强大的模型,相比之下后者在现阶段更可行,我认为浏览器的设计就是一个成功案例。

所以我认为我们写的程序离自然语言太远,抽象层次太低,离自然语言描述的需求太远,所以才导致一个自然语言描述的需求上的变化需要大量的程序来支撑,程序员们做着大量的重复性工作。这其中可以改进的空间非常大。

家园 你的代码行数的问题,本质是不同语言的问题。语言

是为了不同的需求而出现的,随之而来的可能是带着某些所谓的此语言的编程思想,所以javscript+jquery+HTML可以很快速的解决界面的问题,但在其他领域,就像你说的高并发服务的应用,还是需要c\c++来完成,这里不是MFC或者jquery的框架的问题,完全是两种应用导致的。当然,或者也可以发明一种专门写高并发服务的语言,可以快速高质量的开发服务程序,但现实没有出现,原因可能是程序员自己的需求不够强烈,没有创造这种语言工具的欲望,或者是还没有更好的方案来替换C\C++。还是说浏览器,浏览器就是个C/S程序,但因为发明了HTML语言,让页面的设计有了最大的灵活性,写界面也不需要C\C++了。

不过从语言的发展来看,高级语言确实是在开发效率上有很大的优势,而且高级语言的抽象层次也越来越高,导致的结果是编程越来越简单,所以现在才出现了coder,随着技术的发展,你所说的框架或者语言应该会越来越自动化,最终会变成word,excel之类的东西,完全由用户自己解决问题。

看过SAP的ERP软件,感觉SAP的B/S程序应该就不是程序员编写的,可能是有一套专门生成B/S页面的软件,如果以后所有的应用都能达到SAP的层次,那很多程序员就真的失业了。

家园 搞笑死了,当年我也是这么一路从汇编开始,因为没老师

没老师教,就自以为是的以为应该从最底层的开始,买了本ibm pc 汇编语言开始学。。。不过比较好,后来越学越轻松。

家园 也瞎掰编程

看到Fortran很有感触,想当年也是我的第一门语言,用的是谭浩强编的书。后来才学了C, C++, Java, C#和一些脚本、动态语言,结果发现学了C++后,编程变得简单多了。编程很有乐趣,尤其对年轻人来说,读别人的代码确实痛苦,但能学到更多的东西,曾经读过大量法语和意大利语写的程序源码,很多变量也是法语和意大利语的,甚是痛苦,不过熬过来一切都好了,最后看那些代码像和自己写的一样。苦读源码是学好编程的基础。

虽然现在不怎么写程序了,但想起当年还是看了些好书,记起来一些,列在下面,共享之。

C:《The C programming Language》,by Brian W. Kernighan,书很薄,很经典,谭浩强的书对初学者不错,但写得太教条,在我们当时编程语言书贫乏的年代,还是不错的书,现在就不需要看了。

C++:《Thinking in C++》,《C++Primer》《Effective C++》、《More Effective C++》、《VC6.0内幕》(很老的一本,当时很热衷),这方面的书很多,多读几本,才能深刻理解C++精髓。对C++的博大精深的偏爱使我当时在很长时间对java和C#产生抵触。

Java:《Thinking In Java》, by Bruce Eckel,看完这本书就差不多了

C#:有前面的基础,好像不用再看什么书了,随便找点介绍C#的资料看看就可以了,无非就是多了attribute,event,delegate等。

编程方面:《Programming Pearls》,编程经验不错

算法:《Introduction.To.Algorithms》,不得不看的算法好书

软工:《design pattern》看个三五遍才能真正提高内功

计算机系统:《Computer Systems:A.Programmer's Perspective》,是本好书,可惜没看完。

怀念单纯的编程时光!

关键词(Tags): #编程
全看树展主题 · 分页首页 上页
/ 14
下页 末页


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河