对中国开发者最具吸引力的科技企业有哪些?快来为你 pick 的企业投票! 了解详情
写点什么

为什么你写的代码糟透了?

2020 年 2 月 12 日

为什么你写的代码糟透了?

我经常在 Reddit 或 Quora 上看到有人问“怎么知道自己是否可以成为一名成功的程序员”?。当有人在考虑职业转型,或者对软件开发感兴趣,并且对软件开发所涉及的内容感到好奇时,就不可避免地会问这样的问题。


事实上,对于那些没有正式接受过计算机培训的人来说,这个问题会成为他们脑子里的一个主要障碍。他们会很自然地认为,如果自己不擅长编程,是否可以往这方面想?就好像你想成为一名演员,但又怀疑自己是否擅长表演。


作为一名教授全栈 Web 开发的教育工作者,我教过很多“初次进入这个领域的程序员”。好消息是,我很少会遇到无法学会编程的学生。我认为编程是人类的一项基本技能,就像阅读、写作和算术一样。任何人都可以做到,它是人类能力的一部分,但确实需要进行有意识的学习。


在过去两年中,我目睹了各种各样的学生在这个过程中的挣扎,以及他们在挣扎过程中出现的一些问题。看一下下面的清单,如果你在自己身上看到了这些问题,说明你可能在编程方面糟透了,你可以考虑去做一些更适合你的事情。但是,如果你仍然极力想成为一名程序员,那就可以轻松面对这些问题,并做出改变。


下面的清单将帮你了解你是否在编程方面糟透了,并且如果你想要做出改变,可以做些什么。


1.缺乏好奇心


如果你对计算机和技术原理缺乏好奇心,那就永远不会成为一名成功的程序员。


对学习的东西感兴趣是学好东西的基础。如果你对技术没有好奇心,就不具备足够的能量坚持下去,因为要成为一名成功的程序员,需要进行广泛而深入的学习。


技术世界就像一片浩瀚的海洋,充斥着有趣的领域知识、相互连接的想法,以及可以激发想象力的无穷可能性。它需要内在的动力去潜心研究并发现你所能发现的一切。


找到你的好奇心:问问自己是否真的对编程感兴趣。如果你的答案是“否”,那么去寻找你感兴趣的东西吧,请省下你的时间和精力。但是,如果你的答案是“是”,那么就去寻找你之前没有注意到的东西,潜入那个浩瀚的海洋中去吧。


2.缺乏自主性和智慧


如果你不去培养解决问题的能力,那就永远不会成为一名成功的程序员。


毫无疑问,想要成为一名成功的程序员,你必须对自己的学习能力充满信心。这实际上是一项基本的生活技能——如果你年满 18 岁,没有人有义务教你什么。这就是现实。你要自己去探索对你来说最重要的东西。


在软件开发的世界里,你需要的信息都可以在一个神奇的地方找到,这个地方以前被称为信息高速公路。而这个庞大的图书馆有一个巨大的入口:搜索引擎。你首先要学会在搜索引擎中输入任何你想要的内容,并获得所需的信息,这是学习技术的第一道障碍。


除了成为一个优秀的搜索引擎用户之外,所有编程语言都提供了文档和规范,它们非常明确地说明了编程语言的工作原理。这就像使用字典一样——当你看到一个不认识的单词时,就开始查字典。对于程序员来说,阅读文档是提升技能最快,最可靠的方法。


利用资源:你需要的所有答案都已经在那里。当你遇到问题时,先使用搜索引擎,然后再向其他人寻求答案或查看文档。


3.面对问题时无法坚持


如果你在面对问题时很容易就放弃,那就永远不会成为一名成功的程序员。


编程的本质是解决问题。这就是为什么人类要发明计算机!当你开始写代码时,会遇到一堆问题。在你解决了一个问题之后,通常会有另一个问题在等着你。解决问题的过程就是你取得进步的过程,但总有新的问题需要面对。


总是要面对一堆问题可能会让人望而生畏和沮丧。如果你认为事情做到“差不多”就行了,那么你就不会有足够的能量坚持下去,因为问题会持续出现,它们会一点一点消磨掉你仅有的热情。


根据我的教学经验,通常每个班级都会有一到两名学生,他们似乎会比其他学生遇到更多的问题——通常都是很随意和模糊的问题。我提醒学生,他们遇到的问题越多,学习就会更深入、更彻底。如果他们能够通过解决这些问题理解到更多东西,他们就会变得更加自信,因为他们比普通学生面临并解决了更多的问题。


耐心接受:你需要认识到,问题实际上就是挑战。你面临和克服的每一个挑战都会让你更深刻地理解和更好地面对新挑战,并迅速解决旧挑战。


4.解决问题没有成就感


如果你在解决问题后不会感到兴奋或没有成就感,那就永远不会成为一名成功的程序员。


在成功解决问题后缺乏一种“良好的感觉”,这与前面的太容易放弃其实是有关系的。当修 bug 变成一种似乎永无止境的任务时,从克服问题中获得的兴奋感会离你而去。


在应对挑战时,实际上需要多巴胺的刺激。这种体验有点像视频游戏中的升级或玩填字或数独游戏。我们都知道,坚持完成一个挑战并最终取得胜利,这样会获得一种良好的感觉。但如果你失去了感受这些感觉的能力,或者从一开始就没有真正关心过,那么你将无法体验到编程带来的快乐。如果你认为编程是一种苦差事,只想尽可能轻松地获得结果,那么你就永远不会成为一名成功的程序员。


庆祝你的胜利:每当解决了一个困扰你已久的问题,无论是多么小的问题,都要为你的成就感到自豪。休息一下,给自己庆祝一下,让成功的感觉进入你的身体,并让它激励你面对下一个问题。


5.缺乏耐心


如果你对学习感到不耐烦并希望能够快速而轻松地掌握所有东西,那就永远不会成为一名成功的程序员。


人类的能力是有限的。即使我们的世界发展得越来越快,而计算机是促成这种发展的一个重要动力,但我们也只能尽可能快地跟上世界发展的脚步。我们的大脑以一定的速度运转,并且取决于我们的过去、信念、情绪、健康……我们学习和整合信息的速度是不一样的。


技术世界就像浩瀚的海洋,你永远无法走到尽头,无法成为一个不再需要学习任何东西的高手。如果你让自己不知所措,就会有一种想要“迎头赶上”的压力,你会觉得自己知道的永远不够多。如果你不能接受你所知道的,然后再多学一点,你会觉得自己没有进步,然后就会放弃。


相反,你要享受自己的学习之旅。你掌握的每一点知识,或者获得的每一项新技能都应该让你感到兴奋。就像解决问题一样,你需要让自己感到自豪,因为你已经向前迈出了一步,即使是很小的一步。


承认你的进步:有很多东西需要学习,编程之旅永无止境。但这些知识是可以累积的,所以要为自己所知道的事情感到自豪,并相信你在学习中所付出的一切努力都将为你的职业生涯打下定坚实的基础。


6.厌倦了思考


如果你懒于思考,把集中、专注的思考看成是一件苦差事,那就永远不会成为一名成功的程序员。


编程是一项思考活动。作为人类,我们非常擅长思考,但现实情况是,即使我们很自然地花了一整天去做这件事,我们在思考上仍然是懒惰的。如果你还不习惯,那么要想在一段时间内集中精力解决一个问题是很困难的。


这种情况的症状包括茫然地盯着屏幕、感觉脑袋上笼罩着乌云、拖延、在浏览器标签之间切来切去,以及拼命在 StackOverflow 上寻找“答案”。这些迹象表明你已经达到了思考极限。


在编程过程中,你会感到疲倦,思考就像锻炼身体一样会消耗你的能量。当你不习惯运用所需的精神能量时,会感到很难保持专注。但就像去健身房一样,你做的越多,就越强大。


你的大脑就像一块肌肉:你的大脑就像一块肌肉——当你使用它时,它会在思考过程中变得更好,更有效率。当你把各个部分放在一起形成思维概念时,寻找解决方案就会变得容易得多。


7.无法自己思考


如果你希望别人为你考虑,并且不愿意自己去探究细节,那就永远不会成为一名成功的程序员。


当你在学习新东西时,会觉得自己缺乏知识和经验,无法拥有自己的观点。太过主动或者做错或说错某些东西似乎是有风险的。


我们都会有一种固有的恐惧感。当对犯错的恐惧抑制了探索欲和好奇心时,你就会扼杀掌握知识的能力,而这些知识需要从经验和“失败”中获得。当你需要依赖“权威”、受欢迎的博主、最佳实践或“教科书”给出的答案时,你就没有真正整合编程的实用知识。


你需要发展自己的观点,了解哪些东西是有效的,哪些是无效的。你需要了解为什么你的解决方案是有效的,以及它的好处是什么。你需要发展一种超越显而易见的事物的微妙视角。你需要能够为你的立场“争辩”,如果你的看法变了,就可以获得新的视角。


自己去思考:通过你的经验和批判性思维技能来发展自己的观点。做出合理的猜测,表明立场,并愿意随着新信息的出现而做出改变。


8.僵化、狭隘和紊乱的思维


如果你的思维僵化,并且很难保持代码的条理性,那就永远不会成为一名成功的程序员。


有时候,我会在学生身上看到两个极端。第一种学生拥有僵化而狭隘的思维方式,他们拒绝帮助,尽管收到了反馈,也不会做出改变。他们只从一个角度看待事物,建议通常会被他们忽略。


第二个极端是思维混乱。这种学生似乎喜欢把事情复杂化,他们的代码很乱,难以理解。他们过度思考问题,10 行代码就可以解决的问题他们要写 100 行。


当这两种思维模式结合在一起,就会形成一种严密的编程方式,就像使用蛮力一样,会导致一层又一层的修复和“hack”。这个时候需要回顾解决方案,重新评估它,并放弃最初的方法,然后重新组织解决方案。


看不到其他可能性或无法收到其他反馈会抑制成长和进步的能力。没有条理性会减慢你的速度,阻止你看到原本显而易见的模式。你的整体学习质量就会下降。


自我反思:你需要退后一步,从更广的角度看待你是如何处理事情的。怎样才能做得更好?可以做些什么让你的生活变得更轻松?你错过了哪些可以帮助你获得提升的东西?


9.只在意“正确”的答案,不想去找出一系列“好”和“坏”的答案


如果你认为编程的最终目标是找到正确的解决方案,而不是一系列解决方案,那就永远不会成为一名成功的程序员。


在开始学习技能或编程时,学生通常想知道他们所做的是不是“正确”的。但答案总是“取决于”。


计算机科学是一门评估权衡的科学。对于不同的情况,采取哪条路经会更好?这一切都取决于具体的情况和目标。如果你将编程看作是一个正确答案或错误答案的测试,那么你就会忽视大局,创造力会与你擦肩而过。任何答案都可以是“正确”的,只要你能在特定情况下证明它。


现实情况是,编程更像是写诗或短篇小说(大型程序就像是小说)。在你的代码中可以看到一种美感,有时只有你和其他程序员可以看得出来。你做出决策的原因和你构思答案的方式比“正确的方式”或“错误的方式”更加重要。拥有艺术家的头脑会让你拥有更多的选择和可能性,而不是认为只有一种答案。这就是编程之美,解决问题的方法有很多,思考不同的可能性会让人产生一种感觉,知道哪个解决方案是最适合的。


变得有创意:要意识到解决问题的方法有很多,通过经验和接触,随着时间的推移,在选择解决方案时你会形成一种微妙的理解能力。从大局出发,想象不同的可能性,相信自己的直觉,你会找到更好的、更令人满意的解决方案。


10.不注意细节


如果你忽略细节,忽视小事情,那就永远不会成为一名成功的程序员。


计算机是精密的机器。在进行计算机编程时,你需要以计算机期望的方式精确地提供必要的命令。如果你不这么做,就什么都不会发生。一个程序要么可以运行,要么不能运行,不存在所谓的中间地带。


所以,在编程时,你必须注意细节。每个空格、括号或分号都很重要。出了一点问题都不行。当计算机返回错误消息时,你必须能够准确理解它告诉你的信息。而现实情况是,如果你错过这样的细节,可能需要再花费数小时追查一个问题,而这个问题实际上可能是由一个错别字导致的。


细节决定成败。对于编程来说,这绝对是至理名言。


注意细节:细节很重要,你必须接受这个事实。如果你可以做到,那就从一开始就扫描代码,找出任何不恰当的地方。你可以借助一些可以帮助你快速识别问题的工具。


11.Tips:掌握商业思维


这是我观察到的另一个结果——注重商业思维的学生往往更关注结果而不是过程。他们希望得到一个“可运行的应用程序”,帮助他们将商业理念向前推进,他们希望“先进入市场”,认为学习曲线是他们实现业务目标的障碍。


在反思那些难以帮助他们成长为程序员的学生时,我发现了他们对这个过程缺乏耐心,缺乏耐心给他们理解技术带来了阻碍。他们往往把技术视为一种达成目的的手段,而不是一个可以探索和享受的领域知识。


作为这一观点的延伸,我发现有些学生很有商业头脑,他们在学习中会遇到困难,但往往很快就有客户与他们签约,从事自己实际上并不擅长的工作!他们会争先恐后地寻找资源或模板让项目跑起来,或者把工作外包给其他人。他们在编程方面确实很烂,但在让人们付钱给他们编程方面却很有一套!


所以我想要补充的是,那些渴望创业的学生,在销售、网络和业务发展方面都很优秀,他们可能比其他人更难以学会编程。他们天生希望创造经济机会,并将人们与解决方案联系起来,这导致他们对编程中涉及的繁琐细节感到不耐烦。


12.结论

虽然编程可能是一项难以掌握的技能,但大多数人肯定都能学会。上面的清单列出了妨碍我们取得进步的态度和思维方式,但大多数人都可以克服它们,并培养出编程能力(不一定要精通)。


原文链接

10 signs you will suck at programming


2020 年 2 月 12 日 10:412110
用户头像
小智 前 InfoQ 主编

发布了 399 篇内容, 共 315.9 次阅读, 收获喜欢 1755 次。

关注

评论

发布
暂无评论
发现更多内容

架构师训练营第一讲-学习总结

索隆

《Golang工具go doc使用透析》

卓丁

golang godoc go doc golang如何实现接口 源码阅读

为什么软件交付要快?因为要有赢的感觉!

刘华Kenneth

DevOps 敏捷 MVP 最小可用产品 持续交付

编程基础

南山

读《你的灯还亮着吗》

liu_liu

读书感悟

你了解 SpringBoot java -jar 的启动原理吗?

猴哥一一 cium

Spring Boot Java 面试 Fat-JAR JAR URL Java 25 周年

ARTS打卡计划_第二周

叫不醒装睡的人

ARTS 打卡计划

阿里架构师用心整理JVM与性能优化核心知识分享

周老师

Java 程序员 JVM Java 面试 计算机

k8s 上运行我们的 springboot 服务之——自动化测试

柠檬

maven DevOps Unit Test

JVM学习笔记——JVM类加载机制

王海

Java JVM Java 面试

架构师训练营作业1-食堂就餐卡系统设计

索隆

官方源、镜像源汇总

JackTian

镜像源 官网源

大话设计模式 | 2. 策略模式

Puran

C# 设计模式

【在云端 001】欢迎来到云原生

Bora.Don

云计算 云原生

[转载]Go 和 Java的15个主要差异

卓丁

Java golang

公司治理的两个关键要素:存在的基石 + 成长的飞轮

泰稳@极客邦科技

发展 公司管理 增长

OFD 版式技术解析系列(二):OFD的颜色显示

华宇法律科技

Flink 源码分析之写给大忙人看的 Flink Window原理

shengjk1

flink flink源码 flink window

[翻译]The Go Blog《Go maps in action》

卓丁

go golang hashmap map 哈希表

B端产品经理养成记(4):敏捷项目

涛哥

敏捷 产品经理

利用工作日志提高效率

Janenesome

思考 工作方式

算法基础:排序算法看这一篇就够了

公众号:好奇心森林

排序算法

原创 | TDD工具集:JUnit、AssertJ和Mockito (二十一)编写测试-动态测试

编程道与术

Java 编程 TDD 单元测试 JUnit

使用 Docker 镜像 | Docker 系列

AlwaysBeta

Docker 容器 虚拟私有云

推荐几款有意思的小众 App(06.13)

静陌

产品 App

1. 版本管理工具及 Ruby 工具链环境

Edmond

rubygems CocoaPods VersionControl PackageManager Git Submodule

你不能不掌握的软技能——业务语言

KAMI

方法论 开发 沟通 软技能

架构师训练营第一周作业

Benjamin

ARTS WEEK3

紫枫

ARTS 打卡计划

Shell的技巧小总结(MIT Missing Semester)

AndersonKim

Shell MIT 计算机 Computer Science 计算机工具

个人编程技能全景图

南山

数字化管理体系建设

数字化管理体系建设

为什么你写的代码糟透了?-InfoQ