当您获得经验时,总体而言,编程是否变得更容易阅读,编写和理解?[关闭]


80

我是编程的新手,我一直在读书,学习,阅读文章等等。自从开始学习编程以来,我取得了不错的成绩,当我还是一个初学者时,我曾经以为自己对编程有所了解,但是随着我学到更多,我意识到了该领域的困难(实际上所有领域都很困难,但这不是重点)。

如今,我已经编写了功能软件,并且学习了3种语言的BASICS,并且我只是一种语言的中级。当我查看MYSQL,OpenGL编程甚至Visual Studio C ++代码之类的高级内容时,它会让我头疼,甚至在可视化许多网站的HTML源代码时(Google chrome看到的网站上的大多数源代码看起来也很凌乱和无组织。 )这让我很困惑。乍一看似乎很简单,但是当看这些高级的东西时,我只是想知道如何学习到很多东西。

简而言之,问题是,随着程序员的职业发展,这些事情是否对他们而言变得更加清晰。随着学习的深入,上面列出的复杂主题(OpenGL,MySQL,高级html站点)是否变得更易于阅读,编写和理解,或者随着学习的进行变得更加复杂?您如何克服这种感觉,即您是编程世界中的蚂蚁,而这玩意儿正在压垮您呢?


24
我建议您阅读:norvig.com/21-days.html
James P.

像其他任何东西一样。直到技术发生变化为止。:-)
MathAttack 2012年

3
只要您的“经验”不会一遍又一遍地读同样的东西。用新东西舒展自己。
JeffO 2012年

一个小技巧,要分析复杂的HTML页面,您需要使用Firefox的Firebug或Chrome的Inspect Element。
Lie Ryan

6
“当我还是一个初学者时,我曾经以为自己对编程一无所知。” 到那里去,我学到的越多,我就越了解我所知道的很少。
Lieven Keersmaekers,2012年

Answers:


134

简短的回答:不。

长答案:

是的,阅读其他人的代码变得更加容易。但是只有阅读。随着您获得经验和技能,您作为开发人员的个人需求会不断增长。

  • 您不想只编写代码。您想编写漂亮的代码

  • 您不认为您的代码可以在理想条件下运行。您开始考虑运行代码,处理异常,考虑硬件问题,网络延迟以及随着技能提高而加剧的所有不良情况。

  • 您不会以唯一的语言来读写代码。作为一个熟练的开发人员,您知道要解决您现在遇到的这个特定问题,函数式编程是更好的选择,因此您现在必须使用函数式编程语言读写代码。

  • 您不会将自己限制在少数已知的库中。如果您使用C#编写代码,则需要了解和使用 .NET Framework 许多库的全部功能

  • 您不再使用记事本。你需要你的功能强大的IDE,并且想知道如何对代码进行单元测试,代码度量标准是什么,以及IDE可以向您显示的数百个选项和窗口的含义是什么。

  • 您不想谦虚地限制自己使用该语言为您提供的一组基本工具。在C#中,您希望在单个项目中使用泛型,代码协定,反射,事件驱动的开发,LINQ的功能方面,Reactive扩展以及您学到的大量其他知识,如果这些东西可以帮助您更好地编写,码。

  • 您不会开始编写代码。您花费了80%到90%的时间来收集需求,创建应用程序的体系结构,编写单元测试,编写文档等,并且只花了10%到20%的时间来编写实际代码

  • 您关心安全性。您知道应用程序操纵的数据可能引起的法律问题。您知道什么是ITIL。你知道一些ISO标准并且每天在工作中应用它们。

是的,您会获得经验和技能,并且利用所获得的所有知识和智力,可以更轻松地解决给定的问题。但是您必须解决的问题也越来越多,而您对解决刚开始编程时所解决的问题的水平并不感到兴奋。

在获得技能的同时,您还可以洞悉软件开发的复杂性,了解开始学习编程时甚至都无法想象的方面,并且希望并需要应用每天学习的所有内容。

简而言之:

  1. 在开始学习编程的第一天,列出从1到100的所有数字(可被2整除)的任务非常复杂:您刚刚学习了如何制作循环并在屏幕上显示数字,但是却不知道如何查找是否该数字可被二整除。

  2. 十年后,相同的练习似乎非常简单。而且,十年后,您正在编写必须使用事务的应用程序,这些应用程序必须托管在多台服务器上,并且必须正确处理服务器之间的会话状态,并存储客户的银行帐户详细信息以及由此产生的所有安全性和法律方面。

  3. ...并且您想知道自己“我怎么可能那样做?” 就像十年前一样,必须将数字显示在带有循环的屏幕上。

当您在某个领域中一切变得轻松时,这意味着您在该领域中已经达到了完美,或者您不再关心。

无论您多么聪明,都不可能在软件开发这样广泛的领域中实现完美。


36
如果两者都冻结,那么在水上行走和根据规范开发软件很容易(这表明“您不开始编写代码。您花费数月的时间收集需求”有点不切实际)
jfs 2012年

9
“函数式编程是更好的选择 ”值得商bat。
jfs 2012年

15
我当然希望“功能性编程”只是“使用正确的工具完成工作”的一个示例,而不是暗示功能性编程实际上更适合一般使用。
Ben Brocka'2

7
我还要指出,基本上没有发展的“几个月的收集需求”只会在理想化的Waterfall模型中发生。如果您不进行迭代,就会杀死自己和项目。
Ben Brocka'2

8
“它永远不会变得容易,您只会变得更快。” /格雷格·
勒蒙德

20

小时候,您会学习说话,然后阅读您的母语。起初它的简单机制很费劲,但在某些时候却流利了。但是,您仍然有大量的未读书籍,在某些主题上,您必须首先增加词汇量才能理解这本书。

计算机编程也是如此。在某种程度上,语言本身不再像外语,但是仍然有很多用该语言编写的东西您还不知道。但是,您需要付出一些努力才能访问所有内容。

一些编程工作非常重复,基本上为不同的客户重新实现了非常相似的软件。在这些工作中,您可能会觉得自己陷入了学习的平稳期。您所做的其他工作一直都在做着新颖而独特的事情,并且永不停止学习新事物。


18

这里已经有一些非常好的答案,但是我想我可能还要补充几点:

当我还是一个初学者时,我曾经以为自己对编程一无所知,但是随着我学到更多,我意识到了这一领域的困难。

这称为Dunning-Kruger效应。在初学者程序员中,甚至在许多领域中的初学者中,这都是极为普遍的。

谷歌浏览器看到的网站上的大多数源代码看起来非常凌乱且无序

编写这些网站的人是否希望您能够理解它们?可能不是。拥有难以理解的代码符合他们的利益。

这只是让我想知道如何能学到很多东西。

通过专业化。我是一个非常狭窄的领域的专家:C#编译器语义分析器的设计和实现。如果我花了十五年的时间研究OpenGL或XML或HTML或其他内容,我将是这方面的专家,并且会被语义分析器所迷惑。但是我没有,因此我对OpenGL,XML和HTML仅有非常基本的了解。

简而言之,问题是,随着程序员的职业发展,这些事情是否对他们而言变得更加清晰。

是的,因为您开始看​​到较大的模式。以OpenGL为例。您可能已经看到了一堆“ API库”,这是大量相关代码,其中与代码交互的方式是通过调用带有特定参数的一堆命名函数。而且,仅通过了解OpenGL是一种API就可以对OpenGL有了基本的了解。

当您获得更多经验并看到了许多不同的编程技术时,您会意识到看似无关的技术(例如C#中的OpenGL和LINQ)具有共性。两者都是API,您可以在其中构建用于传输数据的工作流,还可以以丰富有趣的方式对工作流运行优化器和其他转换。一旦在工具箱中有了该概念,突然之间,利用该模式的所有API的全部功能就会变得更加容易。

随着学习的深入,上面列出的复杂主题(OpenGL,MySQL,高级html站点)是否变得更易于阅读,编写和理解,或者随着学习的进行变得更加复杂?

它们变得既简单又复杂。就像我说的那样,这很容易,因为您开始认识到系统设计背后的更大思想模式,从而使您可以更有效地使用系统。更加复杂,因为现在您可以使用该系统解决更复杂的问题,然后开始遇到系统的局限性。

您如何克服这种感觉,即您是编程世界中的蚂蚁,而这玩意儿正在压垮您呢?

你是一只蚂蚁;我们都是蚂蚁。但是这些东西并不是挤压你的脚;这是您可以探索,生活,受益和改善的世界。蚂蚁只能探索其中的一小部分。选择您喜欢的零件,在其中您可以增加真正的价值并成为其中的专家。


2
非常感谢这个答案,它比其他答案都高,因为它不仅回答了我的主要问题,而且使我对某些事情睁开了眼睛。+1
Bugster

@埃里克:在这个话题上,如果他说“专业化是针对昆虫,而不是人类”,您会怎么说?
琼·芬格

@JoanVenge有人会这么说吗?通常,人们都在追求专业化和独特性,如果他们觉得有必要与动物(或昆虫)区分开来,那就更是如此。
马修(Matthew)

1
您误解了邓宁-克鲁格效应是什么,它被定义为不熟练的人 无法识别自己的无能并无法准确评估自己的能力。如果您不认识自己,不知道所有事情,那么您永远也不会学习任何新知识。如果可以识别它,则不是DKE。

+1代表挑选您喜欢的零件,您可以在其中增加实际价值并成为其中的专家。
Akshay Khot

14

简短的回答,是的。

有了时间和曝光,这些事情就变得更容易理解。

请记住,当您从浏览器中的开发工具查看站点时,它们通常是由框架生成的。让那成为无数的东西... ASP.NET,JSP,RoR,Django等...谁知道。其中一些框架产生的代码比其他框架更简洁。

最后,接触导致熟练。没有办法消除这种感觉。只是经验和学习。进入,获取领域知识并学习您的环境使用的技能需要花费时间。


1
只要编写代码的人使用的是良好实践以及特别是该语言和一般程序员的惯用用法,这是有些道理的。错误的编码和/或故意的混淆会使您减慢爬网速度。尝试通过CodeGolf.SE删除。甚至“明文”版本也可能会很难对付,因为在更改比赛指标时牺牲了良好的做法。
dmckee 2012年

@dmckee即使是糟糕的代码,在有经验的情况下也变得非常容易阅读。我在C ++中尤其注意到了这一点(而且我不得不阅读很多错误的代码)。当然,这是一个极大的障碍,但是一旦您开始发现不良设计和常见错误的模式,它将变得更加容易。这些也构成了您将要学习的一种习语。
Konrad Rudolph

2

我同意已经给出的一些答案,但我认为它们也是未讨论阅读代码的根本问题。当我第一次开始看一些开源代码时,它似乎是庞大而庞大的。但猜猜怎么了?它总是会很大。在某个时候,您意识到自己在提取自己想知道的东西并继续前进方面会变得更好。

您提供的一个示例是查看一堆HTML代码,但是:

为什么要查看HTML代码?可能不是因为您想学习整个网站的HTML。您可能希望掌握一个特定的技巧。在这种情况下,只需使用Firebug之类的工具找到相关的HTML。

如果您真的想学习整个网站的制作方法,那么您会意识到,呈现HTML并不是做到这一点的方法。您最好选择使用类似技术的开源项目。但是,尝试学习整个项目的代码并不像听起来那样值得。它无聊,耗时,容易忘记您学到的东西,并且最后没有任何可显示的内容。通过无休止地阅读别人的代码,您将学到更少的知识,而通过使用有趣的特定部分编写插件,功能添加或作为自己项目的支架和建议,您会学到更多。

尝试学习绝对最低要求,以完成自己的工作。仅在遇到困难或想要学习特定的新事物时才返回参考点。这违背了一些传统观念,即您必须了解所有内容,否则您将在黑暗中编程。但是最终,您意识到目标是不可能的,并且您学会了在了解一切的目标和实际完成工作的目标之间取得平衡。


2

简短的答案是“是”,但是很多取决于您如何定义经验。

我认为至少要开发3个部分。随着您在每个细分领域的进步,某些事情会变得更加清晰。

  1. 了解业务需求。这使您可以更好地了解该应用程序。您越能理解业务规则的本质,就越能迅速了解为什么以某种方式完成某些事情。例如,您的客户需要遵守政府法规X,这就是为什么他们需要准备文档Y,这就是为什么他们需要存储这些看似无用的信息的原因。

  2. 了解技术要求。就像#1一样,除了它更多地是关于在技术层面上理解原因的原因。有些工具和技术有其自身的怪癖,直到您对它们进行了处理,然后才难以理解为什么以某种方式完成事情。当您处理旧系统时,这一点更加明显。例如,应用程序使用仅采用XML的特定服务总线。

  3. 了解语言要求。就像其他人提到的那样,您对语言的了解越丰富,您就能越快地阅读原始编码器想要达到的目标。然而,如果没有#1和#2,您会发现这种提高的能力很快达到了顶峰。

尝试参与开发的多个方面,因为直到您至少完成了所有领域几次,它才变得真正容易。

请记住,别人代码中的完美(和目的)总是与#1和#2相关。这些是导致代码保持原状的主要原因。这两个区域的频繁更改是我们始终获得意大利面条代码的最大原因。因此,除非您擅长阅读业务和技术要求,否则阅读代码的任务将永远是皇家PITA。


2

同时变得更容易,更复杂!

认识别人是智慧;
认识自我就是启示。
掌握他人需要力量;
掌握自我需要力量;
知道自己有足够的钱的人就是有钱人。
毅力是意志力的标志。
待在他所住之处的人。
死亡却不灭亡是永恒的存在。

转换为软件开发

知道很多技术是智慧。(一切都源于ALGOL)
知道您不知道的是启示。(LISP)
掌握许多语言,框架和平台需要付出很多努力。(Java)
仅精通您需要知道的内容,并且仅需要掌握才能。(以及Google或stackoverflow.com)
知道什么时候停止编码并交付东西。(无分析瘫痪或镀金)
继续努力以达到目标,这需要专注并且有力量。(一切都在不断变化,您永远都不会完结)
坚持使用一种或两种技术,您将可以忍受。(COBOL仍然很满意,C还是一样)
退出编程并进入管理将永远存在。(或者留下遗留的FOSS软件,让您死后每个人都可以继续使用它)。


因此,您应该成为蟑螂,而不是成为蚂蚁,当它挤压您时就站起来,对吗?:-P
Bugster,2012年

“ Analysis Paralysis”!=“了解何时停止编码”。更多的是“知道何时开始编码”。
Ben Voigt 2012年

0

简而言之,问题是,随着程序员的职业发展,这些事情是否对他们而言变得更加清晰。随着学习的深入,上面列出的复杂主题(OpenGL,MySQL,高级html站点)是否变得更易于阅读,编写和理解,或者随着学习的进行变得更加复杂?您如何克服这种感觉,即您是编程世界中的蚂蚁,而这玩意儿正在压垮您呢?

我将采取与其他受访者略有不同的策略;我相信阅读和编写代码实际上会随着您所做的更多而变得更加容易,并且我将以一个简单的类比来演示它。

想想您什么时候开始运动。从您学到的第一项运动的开始,就很难对一项运动的简单任务进行基本协调。随着经验的增加,您开始精通简单的任务,这样您就不必再考虑它们了,您会发现还有更多需要注意的复杂任务(例如看着其他玩家进行预测)他们的行为)。

然后,当您尝试另一项运动时,您可能会发现刚开始时并没有落后。赶篮球和打棒球有很大的不同,但是精通一个篮球的人比另一个从未做过的人要容易得多。凭着练习第二项运动的经验,您发现第一项运动给了您特定通用的技能。特定技能(打篮球)仅在其领域内有用,而通用技能(在三维空间中跟踪快速移动的物体并制定应对方案)可使您在所有相关领域变得更好。


这与编程有什么关系?阅读的第一行代码将使您了解建立在某些规则之上的世界。您将这些规则(语言的语法和习惯用语)作为特定技能进行了学习,但是您还学习了一些有价值的通用技能:了解计算机在内部的运行方式以及如何以计算机可以理解的方式表达您的意图。您学习的每种新语言都为您提供了一些新的特定技能,但同时也增强了您的通用技能,并帮助您查看通过所有计算机语言所拍摄的图案,例如沿着峡谷壁分层的矿床。一旦真正熟悉了几种不同的语言,即使您对模棱两可的内容有所了解,即使您对所编写的语言一无所知,也可以开始识别大多数任何代码的“形状”。

例如,您提到的所有三种语言(MYSQL,OpenGL,C ++)都有一些共同的特征:

  • 可以分别计算算法的一小部分,然后将它们组合成一个完整的解决方案
  • 在开始处理特定问题之前,计算机通常需要进行一些常规准备(创建表,初始化画布或加载公用库)。
  • 较早的语句优先,并影响较后的语句,即计算机从代码的顶部开始,然后向下移动

您进行的编程越多,您就越会意识到,无论球的形状如何,它仍然只是朝着您的方向而来的球,并且您知道如何处理它而不必考虑太多。所有编程都是关于尝试以计算机可以理解的方式表达您的意图的。学习足够的知识,您将开始能够阅读意图而不是代码。

PS-每次,当您终于开始觉得自己知道自己的出路时,您都会遇到一些绝对会打乱您的大脑,让您感到自己像个初学者的事情。这就是我们对这项工作的热爱,总有一些新东西要学习。


0

简短的回答:是的一般

但是,如果您进行概括,您将不会成为专家。成为专家还意味着了解所有您不知道的事情:这可能是一种压倒性的感觉。

随着时间的流逝,您会获得经验。

随着时间的流逝,其他语言/模式等也在与您的开发并行发展。

您的问题的另一个变量是,您是否在同一个固定的时间段内获得了与该行业有关的有意义的经验。与大多数其他行业不同,高科技行业是一个移动的目标。

一个很好的问题可能是,您是否在某种语言上过于分散或过于分散。


0

这是一个永无止境的奇迹(和焦虑)源,它有多少种计算机语言以及它们在多大程度上不断变化。除此之外,每种语言以及每种框架的大量不同框架以及可用的库和插件。加上数量的代码编辑器和IDE。

所有这些变体都有两个维度的复杂性。

  1. 他们的词汇和语法是不同的。
  2. 它们支持的抽象(高级概念)是不同的。

他们也有共同点。图灵完整性。通过程序员的充分努力,它们都可以用来解决所有问题!因此,如果您以C之类的语言(小vocab,复杂的语法,几乎没有抽象)开始,那么您肯定会感觉到您可以做任何事情(很正确)。

然后切换到诸如CSS,HTML,Javascript之类的“简单的东西”,也许还有Bootstrap和React之类的框架,您的大脑就会像阿尔伯特·爱因斯坦一样大发雷霆。人们认为“我会法语,所以学习德语应该很容易”。没有!

可以从软件模式中学到许多编程抽象。有几本关于该主题的书。模式无处不在,与语言无关,可以一次学习和理解。如果您知道自己的模式,则可以在任何语言中使用它们,并在将其内置到语言中时(在各种框架中)识别出它们。

多数人需要1-2年才能熟练掌握一种新语言,而雇主知道这一点。这就是为什么他们不雇用没有使用其语言经验的人员的原因,因为新员工将花费大量时间来使用该语言,而没有足够的时间来实际解决业务问题。

总而言之,计算机科学原理/抽象,软件模式和您遇到的业务问题的类型,所有这些变化都是缓慢的。您可以学习一次并逐步积累新知识。相反,计算机语言,框架(所谓的“生态系统”)和组件库的变化非常快,围绕它们的所有工具也是如此。在这里,期望学习的步伐缓慢而费时!


-1

随着学习的深入,上面列出的复杂主题(OpenGL,MySQL,高级html站点)是否变得更易于阅读,编写和理解,或者随着学习的进行变得更加复杂?您如何克服这种感觉,即您是编程世界中的蚂蚁,而这玩意儿正在压垮您呢?

当取得任何进展时,我们将学习并重新学习以前认为的知识。-亨利·大卫·梭罗

有一个关于禅宗大师和茶水泛滥的故事。

有时,我们需要放开过去的先入为主的观念和见解,以便我们可以学习新概念。

记住:如果您对一个新概念感到不知所措,则需要寻找许多老师。

最近,当我被分配更新一些使用脚本语言的内部公司软件的工作时,我并不熟悉。刚开始时压力很大。但是,当我改变态度后,我开始找到解释语法和基本概念的资源。我完成了该项目,现在将这种脚本语言用作我的工具之一,以完成更多工作。

您的态度至关重要。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.