西西河

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

共:💬198 🌺258
分页树展主题 · 全看首页 上页
/ 14
下页 末页
    • 家园 编程本质上将自然语言转换成死的机器语言

      我编程也有6年多了,在西西河应该不算多,不过最近天天猛写代码,遇到各种各样的需求,也写了各种各样的代码,对编程中同到的各种难题和各种相似的工作思考了很多,也说一说我的想法。

      我暂且将普通人描述出的语言称为自然语言,自然语言具有模糊,逻辑不严密,不确定性非常多。人脑可以走一步看一步,具体问题具体分析,“如果这样就那样,如果再这样还可以再这样”,可以拥有所有的信息,“当XX在XX的时候就XX,当XX发生XXX的时候就XX,如果那个XX是XX的状态就XX;如果在XX的同时又发生XX且XX的状态是XX的时候就XX”之类;

      但写好的程序不行,写的时候是什么样跑的时候就是什么样。计算机语言就是非常确定,不能看情况而定。程序没有人耳朵没有人眼,不能在需要时随时去查看发生的所有情况,除非程序预先将各种数据记录下来了(并及时保持更新)。

      所以,编程主要解决两个问题:

      1.将抽象的自然语言转换成严密的机器语言,不能错,不能漏,无不确定性;所有情况要考虑到,所有数据要组织好。

      2.从需求中抽象出真正的需求,并建立相应的模型,然后用程序描述之。

      1偏向于coding,而2更偏向于design一点,中间到没有明显界限。

      在1里需要处理太多流程太多细节太多信息,以普通的人脑不可能同时装下所有东西,所以很容易遗露,要么是没考虑到特殊情况,要么是设计出的代码非常难懂难看难改难复用,要么就在一些小地方犯一些弱智的错误,比如变量名写错之类的。对于这些问题有一些解决办法,比如建立好的编程习惯编程规范(用习惯杜决意外的小错误),测试驱动开发(用测试保证在持续开发中没有新问题),耦合内紧外松(集中思维到部分点避免网状关系),面向对象编程(数据与操作的集中,并提高抽象层次),设计模式(现成成熟模式直接利用)。这些好东西都是尽量让程序员需要考虑的东西简单化,集中化,模式化;减少了写程序里程序员大脑里要考虑的东西,解脱程序的大脑,那就减少了出错的机会。

      关于2,稍微偏设计一点,更多的像是对需求的一种翻译,建立起的模型既要灵活易扩展,又要简单易懂易实现,更重要是要很严密的实现需求(按1的标准)。这里的需求不只是指来自客户的需求,也有来自软件开发本身的,比如可复用功能,模块通信机制,模块生命周期管理等等。

      编程中我还遇到的一个比较突出的问题就是重复机械劳动非常多,这里的重复并不是指完全的重复,往往很多需求是大体上基本一样,但细节却各不相同,程序员不得不花大部分时间去处理这类毫无新意的东西;而如果建立和实现一个能适合所有这类变化的模型的话,它需要的代价有时候却又远超过手工完成两个或三个需求的代价; 甚至有时候“细节是魔鬼”,一个细节分析深一点就会发现之前模型都不能复用了。把大部分时间花在这些毫无创新的事上让我很有挫败感,但感觉解放程序员唯一办法是继续提高程序的抽象层次,让程序员可以在更接近自然语言的层次上思考问题,避免过多细节,有一个思路就是走以前汇编-》C语言-》C++的路子,当然这要求底层有更好的支撑库,以及更好的硬件。

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

        现在正在啃erlang和scala

        • 家园 学习路径正好与兄台相反

          学习路径是Java-C-Assembly。

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

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

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

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

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

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

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

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

        的大牛们是否了解?

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

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

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

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

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

      • 家园 看看语言学,看看形式逻辑,再看看数学,再看看计算机

        技术的发展史,你说的这些就很明白了,可惜啊,人总是要感悟好久才能明白这些道理。

        • 家园 所谓纸上谈来终觉浅

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

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

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

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

          • 家园 是的,很多UI库其实都在借鉴网页的思想

            比如iPhone上著名的three20库(facebook是开发者),就将诸如stylesheet,layout,shape等抽象出来,将其应用于构建UI。

            Qt上貌似也有QStylesheet,QVerticalLayout之类的玩意。

            再比如,url映射也很实用。将controller与某个url绑定,用来实现导航,或者其他目的,简化了很多代码,看起来也更整洁。

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

            变化本身,所以无论你一开始的抽象和设计有多完美,最后还是会被要求插入新的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的层次,那很多程序员就真的失业了。

      • 家园 是的,编程实质就是翻译

        特别是搞 MIS 方面的

分页树展主题 · 全看首页 上页
/ 14
下页 末页


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

Copyright © cchere 西西河