写代码容易,编程并不容易

当我的编程生涯开始的时候,我认为“编程很简单……怎么会需要去学校学习呢?”但经过学习和实践,我了解到编程很难。

不知道是编程不难还是我什么都不懂。 ~MemeGenerator.net

自我评价对我自己来说一直都很重要,因为在一天结束的时候,不管别人怎么想,自己的想法都很重要。我会在评价中思考强项、弱项、学习、训练和个人成长。这个过程让我反思、理解并思考成为一个程序员究竟意味着什么。

教育:编码?编程?关键性的抨击?

我在技术领域的第一份工作主要是通过 HTML、CSS 和 JavaScript
操作一些元素并创建视觉效果。在这段时间里,我没有真正想到自己是一个程序员,对于这个问题,我从来没有想要成为一个真正的程序员。不久以后我想使用
NodeJS、PHP 和 MySQL
做更多事情,这时候我开始考虑这个问题。把我作为程序员的所有宏伟想法加起在一起,我在第一份工作中把自己当作一个小小的“软件工程师”,一直都在积极地制定方案。

“经验告诉我,我会颇具气势地拍、打和敲击键盘,但那并不是编程。”

编程需要思考和理解各种数据类型、结构,并理解编程语言赖以构建服务的技术。差异主要在于完成特定任务时所使用的流程。重点不在于数据类型、设计模式、算法类型、性能或任何与代码和应用程序质量相关的内容。相反,它被纳入了实际的工作机制和技艺之中,这往往需要耗费大量的时间,最终变成一只难以维护的巨兽。一直运行输出到不同地方,并积极地测试输出,直到它非常类似于一个功能。如果有什么事情给我一种编程的感觉,但我在实际操作中并没有做到将想法付诸行动。

思考数据

数据结构是我感受到教育不足的一个方面。数据结构背后的想法是,你有不同的方法去存储、提取、排序和搜索数据。最初当我开始编程,我从来没有想过各种数据的任务与数据类型的性能。对需要存储、排序或遍历的任何事物,通常默认使用数组(包括哈希、json、字典,以及键-值数据集的其他术语)。

从计算机科学的角度看,集合、堆栈和队列对我来说是很有趣的,但在 Ruby
编程语言中看到一些实际操作之后,对我来说并不那么吸引人。在我看来,堆栈和队列是一样的,它们允许你从数据的末端获取信息,队列的例外情况是,你只能按照它们加入的顺序获得这些项。当我开始想象这一点时,我想把东西放在一个列表中,等待处理,减少可在后台运行的任务的开销。事实上在高层次的编程语言如
Ruby 中对此付诸实践,并没有多大意义,因为它基本上是在往数组中 push(后追加)或 unshift(前添加)元素。

比如,Ruby 中的栈可以像下面的代码一样简单。


  1. class Stack 
  2.   # init stack  
  3.   def initialize 
  4.      = Array.new()  
  5.   end 
  6.   # put a new item at the end of the stack  
  7.   def push(x) 
  8.     .push x 
  9.   end 
  10.   # get the last item in the stack 
  11.   def grab 
  12.     .pop 
  13.   end 
  14.   # is the set empty true false bool  
  15.   def empty? 
  16.     .empty? 
  17.   end 
  18. end 
  19. # implemented stack 
  20. s = Stack.new 
  21. s.push 'a'  
  22. s.push 'b' 
  23. s.push 'c'  
  24. s.inspect #<Stack:0x48b66454 =["a", "b", "c"]>  
  25. puts s.grab # "c"  
  26. puts s.grab # "b"  
  27. puts s.grab # "a"  
  28. s.grab.inspect # nil 

队列和上面创建的数据类型基本上是一样的,Ruby 已经有一个类了。


  1. # ruby Queue Class 
  2. q = Queue.new 
  3. q << 'a'  
  4. q << 'b' 
  5. # Tests Examples using Queue 
  6. puts q.length  # prints 2  
  7. puts q.pop # prints a 
  8. puts q.length # prints 1  
  9. puts q.pop # prints b  
  10. puts q.length #prints 0 

它的简单性是基于一个非常简单的数组,这本身就体现了它的美。我看到自己在命令行脚本中使用栈或队列,但我不确定还可以在别的什么地方使用它们。

二叉搜索树在处理搜索数据的时间和速度上吸引了我。我经常发现从数据中获取数据非常容易,但在数组中搜索需要花大量时间。这就是为什么需要二叉搜索树,我非常喜欢哈佛的这段视频。虽然我并没有使用这些东西来做过什么,但是非常想用它们来实现点东西,然后将之与原生
Ruby 的数组方法进行比较,看看二叉树比普通的数组或哈希快多少。我在关于二叉权势的研究中试图找到实际的用例,于是发现了这些有意思的文章。

可维护性

我的第一个 Web 应用在可维护性方面可笑极了。没有编码规范,没有设计模式,没有对定义的方法进行整理,没有使用命名空间,也没有对象和模型。如果一定要我去修复缺陷(肯定会有),与其去找实际导致缺陷的方法,还不如重写来得快些。

设计拙劣导致乱糟糟的代码。

我难以处理的问题之一是条件嵌套和循环嵌套。这些循环中存在大量的 if
语句和验证,但这个问题本身来源于一个系统性的问题,即不清楚怎样恰当地组织和拆分程序的不同部分。我曾尝试着在一个巨大的方法中处理所有事情,不关心哪些代码可以重用,也没创建一个模块来扩展对象和方法的功能。为了节省篇幅,下面的代码截取自真实的代码。


  1. print " <h3> Display Weekdays: </h3> "; 
  2. // Looping in a view ... should have been factored diff 
  3. foreach($imageRecords["display"] as $ => $displayRecords) {          
  4.      // WTF is this a nested foreach  
  5.      foreach($displayRecords as $value => $dispRecord){ 
  6.        $tempWeekdayValuesArray = array(); 
  7.           if($value === "weekdays" && !isnull($dispRecord)) { 
  8.              // 3rd nested foreach WTF! 
  9.              foreach($dispRecord as $weekday => $weekbool) { 
  10.                  // :( condition foreach day ::SHAME:: 
  11.                  if($weekday == "monday" && $weekbool == 1) { 
  12.                     // logic removed  
  13.                   } 
  14.               } 
  15.                
  16.            } 
  17.       } 

我不会把责任推到别人身上,这段坏代码是我写的,我会承认这一点,然而其中一些本来可以通过代码导师、或者通过代码审查和“拉”请求来加以缓解。回顾这段代码,我感到惭愧,但这是一件好事,因为它表明了我作为一个开发人员的成长程度。自由在某些意义上是一个问题,但不是在其他方面。例如,对这个项目我被限制于使用
LAMP 技术栈,这是不容协商的,但与此同时,这真的是唯一的限制。我没有使用设计模式,遵循任何风格指南,
使用代码分析器,或遵循代码公约的任何政策。这就创建了一个系统,你可以自由地使用自己的设备,并且如果你还没有了解应用程序的长期性和错误修复,那么它会损害你的最终结果。

我已经真正体会到了文本编辑器的好处,在你编写代码时它会给出提示(指出潜在的错误)从而为你节省很多时间,同时我也开始欣赏与编程相关的一些美好细节。一个写得很好的代码库,会遵循文档标准、清晰的约定和风格指南,阅读起来就像一封电子邮件或一篇网文那样流畅。(当然,有时候使用的编程语言本身就更好)总地来说,我也发现我很喜欢这本书中的许多原则,
Robert C。 Martin 和其他作者的《敏捷软件匠人的整洁代码手册》 。

测试驱动开发

在我看来,测试驱动开发的好处足以证明其优点,但我明白,并不是每个人都同意测试为代码库提供任何价值。我不会争论测试的有效性,但我确实想分享它如何帮到我。在实际创建代码之前,为代码编写集成测试和单元测试已经在很多方面帮到我。它帮助我编写更整洁的代码,高效地编写代码,并帮助我解决了我遇到麻烦的问题。

编写更整洁、更高效的代码与编程中的许多事情有交叉。可读性、性能和编码时间是 TDD
帮到我的主要方面。我发现我能编写代码,不必重构(多次)使其可以上生产线或进入版本控制库。它不仅帮助我减少了 bug,而且帮助我减少了跟踪和修复
bug 所花费的时间。修复 bug
时,我发现我可以接受预期的输入或输出,编写一个与之匹配的测试,然后努力使该测试和所有其他测试通过。这样可以消除
bug,并确保代码实现其预期的目的。

在开始编写实际的方法或对象之前,TDD 可以帮助我组织思路。在更复杂的功能中,它可以帮助我将功能分解成其需要正常工作的集。也就是说,边界条件就是边界条件,并且在最初创建代码时往往更难于考虑到边界情况。最终我觉得测试驱动开发有助于使我成为更好的程序员。

本文作者:佚名

来源:51CTO

时间: 2024-12-30 18:24:21

写代码容易,编程并不容易的相关文章

android-怎么形成编程思想,写代码的时候不知道该干什么

问题描述 怎么形成编程思想,写代码的时候不知道该干什么 最近在看视频学Android,可以看懂视频中的大多数代码,但是让我自己写就有点难了,写完这一步不知道下一步该干什么,甚至是根本不知道该怎么下手,请问怎么才能形成编程思想啊,写不出来就很烦 解决方案 无论是使用什么编程语言,你首先需要确定需求,即功能的定义. 自己用纸来写出整个流程,当然用 Visio 等工具也可以,编程只是个实现的过程,编程用的语言只是个工具.如果你都不清楚想要做什么,和怎么去做,那使用什么编程语言都是一样的. 解决方案二:

c++ 编程问题-设计一个C++编程 写代码

问题描述 设计一个C++编程 写代码 请问如何用C++编程运用调用方式 输出200以内所有的素数 及其个数?? 解决方案 #includeint isprime(int n){ if(n<2) return 0; for(int i=2;i<n/2;i++) if(n%i==0) return 0; return 1;}void main(){ int i,k=0; for(i=1;i<=200;i++) if(isprime(i)) { printf("%3d ",

珍妮的故事:从不会写代码的门外汉到程序员

我不想说出她的名字,这里就叫她珍妮吧. 珍妮有5个最好的朋友,其中2个是Google的工程师,一个是Eventbrite的工程师,一个是架构师,另外一个是她的老爸(一个很可爱的人),是珍妮家乡的州足球队的主席. 珍妮毕业时拿的是企业管理专业的学位证书.这是个错误.在旧金山,企业管理基本上就是说你要去照看别人的工作. 珍妮来到加利福尼亚时是2008年.经济形势对她很不利.她这个刚毕业的人能找到工作的那一点点机会被人才市场里洪水般涌入的中级或高级人才冲的无影无踪.为了生活她别无选择,她找到了一个在药

网页设计师的平衡点:到底要不要学写代码

网页设计师到底要不要学写代码?这个问题很有趣,但是却很少被大家提及.因为在一个网站开发中,网页风格设计和前端的布局代码(比如用 CSS,HTML)是分别是由美工和前端开发人员完成的.两者之间泾渭分明,在业界,几乎也从没有逾越这个界线.当然,这个问题的答案就需要仁者见仁了.不过,你可以阅读下文,或许你能从中找到一些启发. 这是个有趣的话题,不过网页设计师们却很少讨论这个问题.以Photoshop作为起点难度大,在完成第一个项目之后,你会感觉兴奋又紧张.但是,如果你不会写代码,网站的原型设计的用处又

嘿!架构师,你写不写代码呀?

概要: 1.架构师是神马狮,代码是什么马 2.架构师的成长之路 3.架构师是使用代码作画的大狮 4.本期"小狮子"奖 架构师是什么狮,代码是什么马 记得那天是这样的,总导演(右导)一抛出话题,群内雄狮们可炸开了锅: 狮子郭:架构师应该写代码,架构师需验证自己架构上想法的可行性- 狮子肖:架构师必须得做到了解现状,方案与实际相符,别和猿类离得太远... 狮子P:架构最早是源自建筑,没见过建筑架构师码过砖. 狮子木:仰望星空,脚踏大地. 大伙交流得很high,本狮却觉得心底空闹闹的,我们在

IT人的技术哲学书单:谁说写代码、做产品就不需要参禅悟道?

刚刚进入大学校门时老师曾经说过:"无论学习什么专业,只要研究到最后就是哲学."我们笑着问道:"那么,写代码写到最后也是哲学?"老师回答:"是的,那就是技术哲学."现在回想起来,的确如此,我们发现技术中无处存在着哲学.那编写代码来说,对于同样一个功能进行实现,有的同学就会使用了很多的设计思想和设计模式,这样的代码无论是在自己看来还是拿给其他人看都会是赏心悦目的,而且也非常便于后期的重构. 无论是科学家还是工程师,成长不能只局限于技术层面,也要学会如

惊!十二星座程序猿竟然这样写代码

水瓶座 大概只有水瓶座的程序猿可以做到代码神秘到无人能解. 水瓶座,属于风系星座.常被称为"天才星座"或"未来星座".他们较着重于精神层次的提升,是很好的启发对象.对于编程,也是如此.水瓶座程序猿的代码中充满了各种天马行空的奇思妙想,同样也含纳着一般人没法理解的抽象. 双鱼座 如果说水瓶座程序猿写的代码是来自外太空的探险童话,那双鱼座程序员的代码就是浪漫的诗歌,字里行间都是普希金和海子的诗句.众所周知,双鱼座是极其细腻感性化的一个星座,哪怕是编程这种极富逻辑的东西,

33岁还在写代码,感觉人生就这样了。。。.。。。。。。。。。。。。

问题描述 工作10年了.什么cc++linuxc#jsjqueryiosandroid都搞过大公司呆过小公司呆过项目经理组长什么的都做过实在不想上班了,但是为了还房贷和小孩子,又不得不拖着没有灵魂的身体去上班.创业吧..没钱..不上班吧,每月的房贷谁还...把房子卖掉吧,lp又不答应...说要待在大城市...为孩子争取个好环境哎....累... 解决方案 解决方案二:比你大的我还在写代码,更苦逼的是房子都没有--解决方案三:比你小的我,还是在敲代码,更苦逼的是房子,票子,老婆都没有,甚至对象还得

写代码可能是成为软件工程师最容易的部分

当然,写代码是超级重要的,但是我认为它只是整个过程中的一小部分,且不一定是最难学的. 学习如何写代码要花些时间,但是只要有足够的训练(每天写代码,坚持数年),你就能真正擅长它. 你知道的,我相信在某种程度上,每个软件开发人员几乎能给任何软件写代码.(当然有时候这要用更长的时间,但是你不再感到害怕,肯定能按照你的方式来运行.) 我和自己的同事都看到了这种现象.我今天的一部分工作是把项目分配给开发人员,我的团队有一些成员,常常能够适应任何项目.这些家伙就是我说的能够给任何软件写代码的人. 基本上,我