西西河

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

共:💬198 🌺258
分页树展主题 · 全看首页 上页
/ 14
下页 末页
      • 家园 我觉得编程的本质是数学与工程的结合

        从数学角度说,软件需求如同一个方程式,而最终程序是一个解。从基本指令出发,对需求得出一个程序解,如同从基本定理出发,对一个方程推导求解一样。因此,理想化的编程应当如数学推导一样,每一行代码都经过严格证明,最终的程序才能说是正确的。但是这是一个非常难的问题,所以实际工作中只能靠程序员和用户不断测试修正来完善程序,这个过程类似于在数学中对方程无法求得解析解,而采用迭代法逐次逼近求数值解一样。

        从工程角度说,软件的结构设计,编程规范决定软件是否易于维护,就是有了大致解法后如何施工的问题。结构设计良好的软件易于重用修改升级。现在程序员多数思考都着重于这一方面,如各种设计模式。

        软件的数学性代表代码的正确性,而工程性代表代码的条理性。两者有一定相关度,但却没有必然联系。一个设计糟糕写法混乱的程序仍然可以是完全正确的,而一个设计优雅的程序却可以充斥大量错误。

        所谓软件模块化,低耦合度,其实就是分而治之的思想,也就是所谓的分析。将一个大的复杂问题分解成若干相对独立的子问题然后逐次解决。这是对任何领域都有效的。

    • 家园 Oh,

      谭浩强《C语言程序设计》这本书就不要推荐了,除了烂还是烂,烂不要紧,问题是还有些贻害...

      Kernighan和Ritchie两位超级大牛合著的《The C Programming Language》很好

      • Oh,
        家园 这是俺的c语言启蒙书,

        在后来就是看别人的代码,自己写代码摸索了。。。

        书上的来终觉浅啊,还得实践。

    • 家园 C语言的确是很不错的语言

      C是基础,不过确实非常实用,不过指针是个难点,但是一旦搞懂了,C语言就通了。

      编程我觉得真的是思路问题吧,有时候坐一下午,可能也编不出来一个程序,有时候灵光一现,嗖嗖艘,几下编出几天都编不完的程序。

      还是多看实力,多看源代码。我觉得美国人这点很好,都加Comment,看起来很方便,也很容易学习。有些国人编程全顾自己爽,不加Comment。其实如果加了Comment,错误好找,也方便合作编程。

      大力推荐C,指针,函数,结构体,用好了,就走入编程的殿堂了,基本算法也就略之一二了。

      • 家园 恭喜:你意外获得【通宝】一枚 鲜花已成功送出,可通过工

        恭喜:你意外获得【通宝】一枚

        鲜花已成功送出,可通过工具取消

        提示:此次送花为【有效送花赞扬,加乐善、声望、帖得花总数】。

      • 家园 C语言是对冯 诺依曼计算模型的最精简模拟

        掌握了它就掌握了硬件。打下了坚实的基础,学别的语言不过是几个小时的事情。

        • 家园 “学别的语言不过是几个小时的事情”,不敢说大话啊
          • 家园 语言不过是利用几十个关键字所表达的计算模型

            目前就那么几种计算模型。

            当然几个小时只是初步掌握,特别是相近的语言是很类似的,比如VB.net和C#背后的计算模型是一样的,差别就是关键字和语法。

            要真正掌握一门语言,我的意思是说能用来做点严肃的程序,是需要付出非常大的努力的。主要精力是花费在学习和掌握各种程序库和框架,以及由最佳实践和惯用法,语言的设计哲学等等组成的社区文化。这些才是真正的power所在。

            希望你没有误会,我只是强调上面这些东西比一门语言自身的语法关键字什么的重要多了。

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

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

      • 家园 现在要学,还是学Java比较好

        象指针这样的问题,Java里的所有Object都用类似指针的handle,所以不需要象学C时那样强调。Java相对于C这样的相对低级(“低级”指更靠近机器指令)的语言来说,有个好处就是语言本身的特性逼迫程序员去写出更正确的程序来。比方说Design Pattern,C里面那是非自然的,不标准的,你得有意地去应用,而Java里的一些Design Pattern是内建在语言中的,标准的。而且Java的语言特性还可以简化原来在C中比较复杂的Design Pattern,比如说Visitor,原本Visitor和Visitable是要互相配合的,Visitable里要有accept()。可是如果那是第三方的程序,根本没有accept()呢?Java就可以利用反射机制,不需要accept()。另一个例子当然就是垃圾收集。在Java里当然也得担心内存泄露,但是工作量比C里就微不足道了。另外比如多线程编程,用Java和用C的方便程度就更不能相比了。

        有人可能会说C里面程序员对啥都有控制,Java是给水平不高的程序员用的。问题是绝大多数程序员都不是牛人,传说中的牛人是直接拿1和0写机器码的。当然这么说也偏激了,C当然有它自己最合适的使用之处,不过我觉得如今的大多数应用程序都可以用Java或者类似的语言来写而且写得比用C写得好。

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

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

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

        • 家园 呵呵,总觉得C是基础

          其实镭射兄说的对,Pascal比C来讲相对严谨,C也不是完美的。而c99也不过是加了一些头文件,最重要的加入了Boolean来判断True 和False。

          我认为C还是比较自由散漫的一种语言,不用太多控制,随心所欲。当然,针对初学者可能会造成很多麻烦,因为会出现编译能过,程序运行结果却和想象完全不同的情况。

          现在有很多大学把C作为工科的必学科目,我觉得是很有道理的。虽然C可能还是有其不足之处,但是它的基本思路,函数、地址,指针这些东西,在工科中都是必不可少的。尤其是和热机,自动化,这些科目打交道的人,C语言还是有它独特的魅力的。

          当然,Java也是一个相当不错的语言,不过不知道为什么,我用了Java感觉没那么爽,是不是因为Java像兄台所言,由于标准而限制了编写的那种无比的自有感?对Java还是了解不够深刻,还希望指教。

          • 家园 热机,自动化这些有所不同

            指教不敢当,互相讨论讨论而已,毕竟是论坛,我也常常信口开河。

            工科编程的要求我不是太清楚,无法作出评价。关于“用了Java感觉没那么爽”,这个牵涉到个人感觉,如果不知道为了什么具体理由或客观原因而不爽,也很难评价。不过可以猜一下。

            第一个原因可能是写个小程序罗里八嗦的import也一大堆,不过这个其实C的头文件也差不多,习惯了就看对方不习惯。不少事情还是一个“不习惯”可以概括的。从C刚转过来的程序员一定对garbage collection这种事情有担心,总觉得会有内存泄漏或者误删的事情出现,没有具体指令总是不放心。可一旦Java的GC习惯了,再去编C程序,那就觉得管理内存都要事事躬亲简直受不了。

            还有一个原因大概是,Java现在如果不是最依赖于某个IDE的语言,也一定是其中之一。写C的话,你可以用vi,可以用notepad或emacs等,但是作为一个程序员,你不过是依靠这些文本程序写出程序代码而已,最多让它们自动format,把函数名keyword之类的用不同颜色标出等等的辅助一下,对于程序的正确性,你不会依赖于vi或emacs。Java就不一样了,很少听到有人拿vi或notepad写的,如果只是几个class,那还有可能,如果是几十几百个class,那就极其困难甚至不可能了。于是有一种被IDE牵着鼻子走的不爽感。

            还有一种不爽感是Java的typing实在太强,你把long变成int它都不乐意要嚷嚷,从C刚转到Java简直要烦死,更不要说编惯了ruby这样dynamic typing的语言的人了。

            最后,Java现在已经不仅是一种语言而是一种平台了。作为一种语言,学会C++的人几乎不用费太大功夫就能学会Java,C++才是真正比较复杂的面向对象的语言。但是你会发现学会作为语言的Java后,你要学的东西还很多,各个标准的package比如java.util或者java.io里的东西都有很多微妙的东西要学,不要说其他第三方的各种包了。UI那部分比如AWT和Swing就更让人头痛(我就基本不懂)。可以这么说,如果只学会了作为语言的Java,那么几乎还什么都没学会……

            • 家园 Java本质上是为了让傻瓜也能编程

              只要架构师抽象的足够好,找几个新手码字就可以了

              降低了开发难度

              至于线程方面,现在进入多处理器时代,虽然有一些库能实现与硬件无关的线程管理,但做的并不好。

              erlang最近两年大受关注,也是源于其在语言层面上的对并发的支持。Scala既是受erlang启发而发明的语言,运行在jvm上,如果想学Java的话不如学下Scala。

              • 家园 Scala的确很漂亮

                不但在多线程和函数编程方面有优点,在多继承上也比Java灵活。个人来说我喜欢Scala超过Java。

                Scala的缺点就是用的人不够多,光学个Scala自己玩玩还行,要真有要和别人一起合作的时候,恐怕不容易找一个也用Scala的人。而且Scala初学者不容易上手。其实要学Scala的话,先学Java再学Scala和直接就学Scala,在花费的精力上恐怕没啥区别,所以还不如先学Java,然后再决定是不是继续学Scala。

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


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

Copyright © cchere 西西河