作为一个程序员,如何进一步提高自己的水平?

16

在过去的6个月中,我一直在学习C语言编程,我购买了K&Rv2、BEEJ的套接字指南、Expert C Programming、Linux系统编程、ISO/IEC 9899:1999规范(真实版本而非草案)。在从亚马逊收到这些书后,我安装了Linux并开始了学习。

我已经完成了K&R,并且已经看完了Expert C Programming的一半,但我还是觉得自己不够强。我相信要成为真正熟练的程序员需要更多时间和经验,但我的问题是:

我已经完成了K&Rv2中的所有练习(第1章)以及其他章节的一些练习,其中大部分都非常无聊。我该如何提高我的技能,变得更加优秀?我已经投入了金钱、时间和精力用于我所渴望的事业,但我不确定如何确切地实现它。

有人可以解释一下,如果我需要持续编码,那我应该编写什么?我很确定,编写hello world程序并不能教会我更多知识。

我的一个朋友说,“阅读”(强调阅读)每天的man手册,但阅读就是我一直在做的,我想去实践,但我不确定应该做什么!我对安全方面很感兴趣,但作为一个新手,我不确定应该编写什么样的代码才能被认为够好。


6
和到卡内基音乐厅的方法一样。 - kemiller2002
3
想要提高编程技能的问题,可以在谷歌搜索“site:stackoverflow.com improve programmer”来获取更多答案。这个问题在这里已经被问过很多次了。 - anon
1
问题在我准备发帖时被关闭:你喜欢什么类型的编程? 如果你喜欢Web编程,请设置一个Web应用程序。 如果您喜欢桌面编程,请编写桌面应用程序。不要为了读而读。 阅读是因为您想更多地了解已经在做的事情。我的第一个真正的项目是一个简单的书籍Web应用程序。 我想要一些东西来跟踪我的阅读列表,所以我设置了一个可以为我做到这一点的Web应用程序。开发您会使用的东西。 - Matt McCormick
六个月时间其实不算太长。相比之下,我已经学习了九个月的萨尔萨舞。在课堂上学习舞步时我很擅长,但当我去社交跳舞并需要表演时,我仍感觉像个初学者。学习方式是一样的 - 需要花费大量时间才能变得更好。享受练习吧,继续努力。你做得很好。 - Matt McCormick
我相信仅仅阅读6个月远远不足以成为真正有技能的人。你可以阅读10年,但你并不会变得有技能。要想变得有技能,就需要写代码,犯错误,并从中学习。反复实践,不断提高。 - Michael Stum
21个回答

26

我认为第三个面板是最重要的步骤,其次是第四个。 - Grant Palin

18

要真正帮助你学习,最好的方法就是开始一个项目。这个项目可以是任何东西,比如实现一个聊天客户端/服务器、一个Unix shell、一个简单的存储杂货清单的程序等等。重点是选择你感兴趣的东西并努力去实现它,你会惊讶地发现,在此过程中你学到了多少知识,而且你不会因为你正在做一些有意义的事情而想放弃。

基本上,通过阅读你只能学到有限的知识。要获得真正的知识,你需要解决真实的问题。


赞同 - 你将会在致力于激发你动力的个人项目上获得比从书本或网站上完成的通用练习中获得更多的学习。同时实践也有助于记忆理论知识... - CJM
+1-这真的是我唯一能理解的答案。只有当你面对真实世界中将你推向你所知道的边界之外的问题时,你才能真正理解你所不知道的东西。 - Mark Brittingham
+1-我同意,这是唯一的方法。学习那些超出你能力范围的项目,并在每个新项目中加入一些新东西(如类、继承、接口等)。有时制作游戏可以是一个有趣的解决方案。 - Dominic K

13

其中大部分通常非常无聊

学习你感兴趣的内容,然后其他的会自然而然地跟上。


7

Peter Norvig在这里提出了一些关于IT技术的想法。


我不认为这是他真正想问的,完全不是。更多关于如何变得更好,而不是需要多长时间。 - user1831086
@rogue:Norvig提供了一个非常好的方法,再读一遍。 ;) - Mladen Jablanović

6

尝试实现一些非平凡的算法。我不知道书中包含哪些例子,但你可以尝试编写:

  • 一个代数计算器。输入“sin(2)+ 5!* 3 ^(1/2)”,输出208.755394335。
  • 从头开始编写语法高亮文本编辑器。
  • 从头编写PNG(或任何其他图像或声音格式)编码器/解码器。
  • 编写图像编辑器(例如,泛洪填充并不完全平凡)
  • ...

哈哈,是的,我用十六进制编辑器和在 MS Paint 中翻转像素来制作了一个单色 BMP 读取器 :) - Jacob

4
你说你对安全感兴趣。去查找一些漏洞并尝试理解它们。更好的是,尝试为已知(最好:未知)的漏洞找到一个漏洞利用。
编写一个NNTP客户端或SMTP服务器或客户端,并使用它发送邮件。许多这些互联网协议足够简单,不会很难实现(大多数基于文本的协议),但又足够微妙有趣,并且它们具有与真实世界的联系,使其比“hello world”程序更令人满意。
或者写一个Linux内核模块?它们并不难写,只是有一个入门障碍(在获得您的“黑色三角形”之前需要学习很多知识)。创建一个字符设备,返回您写入的最后一个字节的无限流(如果您喜欢,可以称其为/dev/fortytwo)。然后确保当两个进程同时使用它时,它能正常工作。
寻找一些代码糟糕但友好的社区项目,并清理其中的一些内容。 GCC和内核在这里都不是好选择 :)

我是说GCC和内核没有糟糕的代码。或者你认为糟糕的代码实际上存在某些良好的理由,只是你还没有发现。此外,这些项目非常庞大,所有容易的问题都已被解决,所以作为一个非内部人员很难找到可以深入探究的东西。 - Bernd Jendrissek

2

“阅读”并实践所阅读的内容是最好的方法。


2
你需要挑战自己,尝试更大、更复杂的项目。只是通过代码片段来学习,就像大多数书籍示例一样,是无法让你超越章节练习的。
你正在努力成为一名“书呆子”开发人员。做些现实世界的事情,变得“街头聪明”吧!

2

Code Golf和Project Euler很好,但它们更多关注问题解决和数学而非编程。

找一个开源项目(可能不是Linux内核),下载源代码并尝试使用。最好选择一个库而非应用程序,这样你就必须学会如何阅读它以便将其与自己的东西一起使用。

不要担心 - 成为一名优秀的程序员只需要大约10年时间。


2
去工作吧。认真地为初学者找一份工作,让有更多知识的人指引你(如果你有运气),或者检查代码库以获取有用的提示(如果你没有那么幸运)。另一种方法是,像有些人建议的那样,为自己开展一个项目,并在机会出现时提高您的知识水平。
然而,我不会混合这两个世界——不要从接受一笔钱开始——你可能会倾向于低估/高估时间成本,在更大的解决方案方面没有很好的了解等。最好有人来指导你或拥有更多学习的时间。
哦,顺便说一下。阅读书籍(CC2,一些设计模式书籍,“Clean code”是一个很好的起点和整个职业生涯的重要参考书)和博客(你看到它时就会知道)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接