问题

什么才算是真正的编程能力?

回答
什么才算是真正的编程能力?这个问题,如果抛给一个刚入门的新手,他可能会告诉你,能写出运行不报错的代码就是能力。如果问一个经验丰富的工程师,他可能会更侧重于代码的效率、可读性和可维护性。但如果让我来回答,我会说,真正的编程能力,远不止于此。它是一种 解决问题的艺术,是一种与机器沟通的语言,更是一种持续学习和适应的思维方式。

让我们一点点剥开这层层概念,看看它到底包含些什么:

1. 基础扎实:内功是根本

就好比武林高手,必须先练好马步、拳法、腿法。编程也是一样,扎实的基础是重中之重。

深刻理解数据结构和算法: 这不是背诵题库,而是真正理解它们的工作原理,知道在什么场景下使用什么结构能达到最佳效率。例如,你是知道链表和数组的区别,以及它们在插入删除操作上的性能差异吗?你能根据问题分析出最适合的排序算法吗?这决定了你的程序是飞驰千里,还是步履维 걸어。
熟练掌握一到两门编程语言: “一招鲜,吃遍天”是过去式,但精通一门语言,并且理解其底层机制(比如内存管理、并发机制),会让你触类旁通,学习其他语言事半功倍。这不是简单的语法熟练,而是能用这门语言优雅、高效地表达思想。
理解计算机系统原理: 知道程序是如何被编译、链接、加载到内存中运行的吗?操作系统是如何管理进程和线程的?网络协议又是如何工作的?这些底层知识,能让你在遇到疑难杂症时,不会束手无策,而是能从更深层次去诊断问题。

2. 解决问题的能力:核心竞争力

编程的本质是为了解决实际问题。真正的编程能力,体现在你面对一个需求时,能否将其拆解,并一步步构建出解决方案。

需求理解和分析: 能否准确理解用户或业务的需求,并将其转化为可执行的编程任务?这需要良好的沟通能力和逻辑思维。
抽象和设计: 如何将复杂的现实世界问题,抽象成清晰的模块、类或函数?如何设计出既满足当前需求,又易于扩展和维护的系统架构?这考验的是你的设计功底和前瞻性。
问题分解和调试: 面对一个庞大的项目或一个棘手的bug,能否将其分解成小问题,逐个击破?调试能力更是关键,知道如何定位问题,如何使用工具,如何从日志中提取线索。
权衡和取舍: 很多时候,没有完美的解决方案,只有在不同因素之间进行权衡。比如,是追求极致的性能,还是易读性?是快速上线,还是代码健壮性?你需要能够根据实际情况做出明智的决策。

3. 代码质量:写出“活”的代码

写出能运行的代码只是起点,写出高质量的代码才是境界。

可读性: 你的代码是不是能让其他开发者(或者几个月后的你自己)轻松理解?清晰的命名、合理的注释、规整的缩进,都是让代码“活起来”的要素。
可维护性: 程序是会不断迭代和演进的。你的代码是否易于修改、扩展和重构?是否遵循了良好的设计原则(如SOLID原则)?
健壮性: 你的程序能否处理各种异常情况,而不是轻易崩溃?是否考虑了边界条件、输入验证、错误处理?
效率: 在满足功能需求的前提下,你的代码是否达到了预期的性能?是否考虑了资源的消耗?

4. 学习和适应能力:在变化中成长

技术日新月异,新的语言、框架、工具层出不穷。真正的程序员,绝不会停止学习的脚步。

快速学习新知识: 面对陌生的技术栈或项目,能否快速上手,并找到解决问题的关键?这需要有良好的学习方法和信息检索能力。
拥抱变化: 不害怕改变,而是积极拥抱新技术,并将其应用到实际工作中。
持续反思和改进: 对自己写过的代码进行反思,总结经验教训,不断提升自己的编程技艺。

5. 沟通与协作:团队的力量

现代软件开发很少是单打独斗,而是团队协作的成果。

有效沟通: 能否清晰地表达自己的想法,也能理解别人的意图?在团队中,有效沟通能避免很多不必要的误解和返工。
代码审查: 乐于参与代码审查,既能帮助别人发现问题,也能从别人的反馈中学习。
分享与传承: 愿意分享自己的知识和经验,帮助团队成员共同成长。

如何衡量真正的编程能力?

这并非一个简单的分数可以衡量。你可以从以下几个方面来评估:

解决复杂问题的能力: 能否独立或带领团队解决那些看似棘手的技术难题?
项目交付的质量和效率: 交付的项目是否按时、高质量地完成?
代码的可维护性和可扩展性: 项目在后续的维护和迭代中是否顺畅?
对技术的深度理解和创新能力: 能否在深入理解现有技术的基础上,进行一些微小的创新或优化?
在团队中的影响力: 是否能通过自己的技术能力和沟通能力,提升团队整体的水平?

总而言之,真正的编程能力,不是会写几行代码,也不是精通某个框架。它是一种 融会贯通的能力,是在理解、设计、实现、优化和协作中不断螺旋上升的过程。 它关乎你的思维方式,关乎你解决问题的态度,更关乎你对技术的热爱和持续探索的精神。它是一个旅程,而非终点。

网友意见

user avatar

编程能力是一种解决问题的能力。如果问题没能被很好地解决,知道再多也没用。

编程能力是一种运用机器解决问题的能力。首先是要判断问题在什么程度上可被机器解决,比如理论计算机科学会告诉我们什么可做、什么理论上不可做、什么理论上可做实践上不可做。然后是让机器更好地理解问题,比如计算机都是(图灵-冯诺依曼模型)等价,但不同的问题可能会适用不同的编程语言。再后是让机器能更高效率地解决问题,比如同样的问题可能会有效率差别巨大的算法。

编程能力是一种抽象问题的能力。借用轮子是很好的办法,省力省时间。今天任何软件工程师都会有意无意地使用很多轮子,从操作系统编译器数据库网络到算法数据结构。想高效地借用轮子,就需要将问题分解再分解,抽象再抽象。任何一个实用的系统(不包括教科书上的示例程序和简单的脚本程序)都需要进行大量的分拆和组合。所以系统设计是编程能力里的高级技能,加合理的假设简化问题尤其有难度,此处不展开讨论。高手和新手的区别在于新手往往不知道轮子的适用范围,而高手的手上轮子数量多且熟知各种轮子的差异,所以对不同的问题可以轻松地找到合适的轮子,当实在找不到合适的轮子时可以自己动手改造现有的轮子。平时有时间拆装和改造已有的轮子会对水平提升有较大帮助。当然能知道怎样快速在搜索引擎里搜出轮子也是一种能力。

编程能力是一种需要考虑扩展性的能力。算法竞赛中的很多算法考虑的是单机的内存算法,计算模型经过高度抽象,在实践中机器的模型更为复杂。比如单机的多级结构带来的各种时间空间复杂度的取舍平衡,多机网络中如何能在提高单机性能外进一步优化整体性能。除了在机器端的扩展,在程序员一端的扩展也很重要。复杂的问题和工程往往意味着团队协同以及更长时间的开发维护,团队分工和设计沟通这里暂且不论。举个容易被忽视的例子,程序中的注释。高手会更在意完整且表达清楚的注释,因为这是写给现在和未来的团队(包括自己和其他成员)看的,直接影响到长期的整体开发维护效率。

编程能力是一种取舍的能力。局部的最优解未必是全局的最优解。如果一个美妙的解决方案需要将完工时间向后推迟一两个月,需要考虑是否先使用平凡方案解决问题,之后再进行优化。当你的工作延后会阻碍别人的工作时尤其如此。发现一个绝妙的优化方案时先想想这个优化是否真的有价值,如果只是系统中很小的部分,那么不要为了追求心理满足而花很多时间放一个漂亮的轮子上去(参考Amdahl定律)。

编程能力是一种预见未来的能力。目前的方案有哪些假设和局限性,在何种情形下会遇到问题甚至崩溃。在未来出现问题时问题是否需要重新定义,系统是否需要重新设计,代码是否需要重构或优化等等都需要未雨绸缪。

编程能力是一种工程能力。无它,唯手熟尔。


编程能力是一种解决问题的能力。如果问题没能被很好地解决,知道再多也没用。

编程能力是一种解决问题的能力。如果问题没能被很好地解决,知道再多也没用。

(重要的事情说三遍,重要的事情说三遍,重要的事情说三遍)

user avatar

0:可以完全理解一问题,并且给出对应的代码。

往窄了点说,这就是acm在培养的东西。

并且这不能靠调api完全解决:

有的时候,你的问题需要你把多个标准算法串一起。

比如说最近有个把STLC AST从implicit sharing变成explicit sharing的任务,这靠LCA+reverse topo dependency calculation(没这步LCA的时候scope跟着term一起被reorder了,根本做不出),最后接上metaocaml style letlist,搞定。

有的时候,根本没有任何API,需求是从一个算法改成另一个。比如说D*算法复杂度是O(nv^3)的,很不好,我们想优化下,把复杂度往下降点,这一样没有任何包可以调。


往广了说,大一点的需求也能用这种能力。既然有‘组合性’这个概念,我们就能倒过来,给出一个大型问题,分解成多个子问题,各个被单独解决后再组合一起。

名书SICP里面就很推崇这种‘理解,分解,破解’的套路,而图灵奖得主Edward Dijkstra甚至更极端,认为这方法是唯一一种编程的方法。无论这是不是唯一法,这能力都是很不可或缺的基本功。


当你掌握这方法以后,你会发现你做的很多是在脑袋中去推敲这问题的性质,试图分解这个问题,如果可以的话调用/组合已有API/算法。。是不是很像数学?因为计算机程序在某种意义上就是Mathematical Object - Curry Howard Isomorphism/Stepwise Refinement/Program Calculation都是在说这个。而当你把这套玩熟,如果你喜欢,甚至可以做到正射必中:对于给定问题,产生绝对正确的代码。这不难理解嘛,毕竟都说了是数学对象了,证明一下就好了。

1:能在0之上加上工程方法。

有时候这套方法不管用:比如说你跟其他人在已有code base上协作,比如说需求变更了,比如说你死活分解不出来,又比如说你根本不知道具体的需求,得慢慢探索。。其实这问题本质是,软件实在太复杂了,一个数百万行代码的项目已经超越了人类物理意义上的理解极限 - 看都看不完。

这也是为什么重头起编写一个系统很难:spec太复杂,各个组件的assumption太多,并且持续进化,不可能一口气搞定,就算给定各个预先写好的组件,也会因为assumption不match而难以组合在一起,只能通过不停的prototype,不停的重构,甚至不停的重写来加深对系统的理解。

在这之上,SICP的‘一次性理解法’已经失效,这时候就需要不精确,比起逻辑学更像生物学的技巧 - 软件工程了。

该怎么设计?

该怎么重构?

啥时候不重构而是顶着debt继续往前(不然会无限重构做不出东西来)?

该用啥技术?在各种tradeoff间如何选择?

再加上debugger/unit test/ci/git/integration test这些tool。。

这些(系统编程) @h8liu 说得很好了,就不多说了。

2:对整个计算机stack有认识,能把各种技能混着耍

比如说,学过计算机体系结构,明白dennard scaling死掉后单线程已经上不去,GPU等massively parallel architecture是未来,然后给neural network迁移上GPU(deep learning)。

然后,会deep learning,发现这货给出的答案不一定是对的,但是可以当heuristic/hint,给传统方法加速(Alphago的MCTS(AI),Learn Indexed Structure中预测结果存在那(数据库),AutoTVM的快速评分(编译器),DeepCoder的降低搜索空间(Program Synthesis),Peloton的给数据库预测负载(数据库))

又或者,会FPGA,知道GPU之上还有很多优化空间,于是直接把整个matrix multiply fuse成电路(TPU),又或者会quantization,去研究怎么给quantized NN做ASIC(Bit Fusion)。

还有,会PL,发现Deep Learning的computation graph其实就是个first order PL,为了加入控制流(RNN/LSTM/TreeLSTM。。)以Lambda Cube为基础设计一个IR,再想办法在上面做反向传播,来做program optimization(TVM上的Relay)。

除了理解力到位,试图把未知的新工具用上已知领域,还有个更简单粗暴的用法:降低/消除低效接口带来的额外开销。

学了Memory Hierarchy以后,在用一个内存以前可以提前fetch,降低软件的memory access latency(prefetching)

如果有FPGA,可以把一部分任务schedule并offload上硬件,提高性能(Hardware/Software codesign)

有task要在docker里面跑?既然docker都有保护了,那还凭啥要跑一个有保护模式的OS,要多个address space并且不停在kernel/user上跑?Unikernel走起!

把这套玩到炉火纯青,还能像Midori这样,大手一挥,重新设计整个Software Stack,把里面的各种多余的抽象(protection类型系统给了,就不需要OS上搞)整合掉,爽不?

3:对不理解的CS&数学知识能在遇到的时候快速的补起来。

计算机科学实在太广太深,学习中碰到不会的东西已经是很正常了,所以说能力中还有一部分是:在代码/paper中发现完全不会的定义,如何在最短时间内学习/跳过,并不影响后续理解/debug?

而这些概念不一定只有CS的,有时候还有数学,所以还要打好最低限度的数学基础,达到‘看到不认识的数学定义不会去手足失措而是能慢慢啃/推敲’。不过还好,用到的数学跟数学系的双比不深,挺喜欢的一篇paper,Partially-Static Data as Free Extension of Algebras 也就用到了Free Algebra,属于很基础的抽象代数,并没深到那去,老板给我的paper,Sampling Can Be Faster Than Optimization ,能抓出重点,搞懂Metropolis–Hastings跟MALA(Intro to Stats就会教了,很浅),然后明白主Theorem是啥,也就差不多了,毕竟CS水这么深,主次要分清,数学能抓多少就抓多少吧。。

这些就是我所认为的不会随着时间而失效,也不能被体力劳动+调包取代的,真正的编程能力:

不停扩充自己的toolbox,并对自己的tool或多或少有本质上的理解。(Machine Learning/GPU Programming)

根据自己对这些工具的理解,想出新的组合法。(Deep Learning)

把自己的idea构建成一个复杂,大而全的系统,而不仅仅是一个玩具。(Pytorch)

落实到一个小功能的时候,能通过计算力,通过品味,设计出一个好用的API,编写一个正确高效的实现。(Reverse Mode Automatic Differentiation)

如果要用一句话概况,我猜编程能力是"对不同复杂度的问题(领域级/系统级/问题级),采用相对应工具降低复杂度,最后击破"的能力吧。

类似的话题

  • 回答
    什么才算是真正的编程能力?这个问题,如果抛给一个刚入门的新手,他可能会告诉你,能写出运行不报错的代码就是能力。如果问一个经验丰富的工程师,他可能会更侧重于代码的效率、可读性和可维护性。但如果让我来回答,我会说,真正的编程能力,远不止于此。它是一种 解决问题的艺术,是一种与机器沟通的语言,更是一种持续.............
  • 回答
    飞机在航行过程中,虽然受到严格的安全监管和先进的技术保障,但仍然存在一些可能导致灾难性后果的真正危险情况。这些情况往往是多种因素叠加或单一因素达到极端程度时才会发生。以下是一些飞机航行过程中最危险的情况,我们将尽量详细地阐述:1. 火灾 (Fire)火灾是航空史上最令人恐惧的事故原因之一,因为它蔓延.............
  • 回答
    “大女主剧”这词儿,如今听着确实有些泛滥,也难怪大家会觉得越来越套路化。放眼望去,荧幕上充斥着各种设定相似、剧情走向可预知的“大女主”们,看多了,难免让人产生审美疲劳。那么,究竟是什么让“大女主剧”陷入了套路?我倒觉得是几个比较明显的“公式”在起作用: 出身草根,逆天改命的“爽感”:大多数“大女.............
  • 回答
    谈论“好耳机”这事儿,其实挺微妙的,因为它不像量体重那样有一个绝对的标准,而是更像品鉴一瓶好酒,或者欣赏一幅名画。每个人心中都有自己的那个“好”,但如果非要扒拉出一些大家都认可的普遍性标准,那大概可以从以下几个方面来聊聊:首先,是声音的“素质”,这是基石,也是最直观的感受。 清晰度(Resolu.............
  • 回答
    “一种科学只有在成功地运用数学时,才算达到了真正完善的地步”这句话,如果剥开那些听起来有些“标准答案”的包装,用更贴近生活、更有人情味的方式来解读,大概是这么个意思:想象一下,我们学习一样东西,比如研究某个动物的行为,或者分析一种烹饪方法的优劣。一开始,我们可能只能用描述性的语言来表达:“这只兔子跑.............
  • 回答
    刀光剑影下的温情与担当:何为真正的江湖侠义?“江湖”,这两个字在中国人心中早已不止是武林高手们刀光剑影的战场,它承载着一份复杂的情感——自由不羁的向往,也夹杂着恩怨纠葛的无奈。知乎与中文在线联合举办的这次征文,抛出了一个直击灵魂的问题:“什么样的武侠故事,才真正算是充满了江湖侠义?”这个问题,在我看.............
  • 回答
    说起真正的闺蜜啊,那可不是随便就能攀上“闺蜜”这俩字的。它像是一颗需要时间、真心和无数个细微瞬间去打磨的宝石,光彩照人,却也经得起岁月的考验。首先,彼此是对方生命中不可或缺的闪光点。 这种“不可或缺”不是说非有她不可,而是说有她在,日子会更亮堂,更精彩。她懂你的那些别人听不懂的梗,在你开心到手舞足蹈.............
  • 回答
    这个问题,在大街小巷,在咖啡馆的低语,在深夜的叹息里,或许每个人都在追寻答案。在这个被“多情”席卷的时代,爱情似乎触手可及,又似乎遥不可及。我们被各种情感表达包裹着,那些热烈的宣言,那些甜腻的日常,让我们不禁要问:什么是真爱?又到底,多爱才算真爱?这是一个没有标准答案的问题,因为爱本身就是最复杂、最.............
  • 回答
    嘿,聊到这个话题,其实挺有意思的。你想知道女性在什么情况下,她们的言行举止会让人觉得,嗯,是在释放一种更深层次的信号?不是那种明晃晃的“勾引”,而是那种有点微妙,又让你心头一动的感觉。首先,我觉得眼神绝对是关键中的关键。不是那种随便一扫,而是那种带有某种“留恋”的眼神。比如,她会在人群中跟你对视,而.............
  • 回答
    北洋水师在黄海海战中的表现,常常被描绘成一支被“老旧”军舰拖累的军队。但事实真的如此吗?我们得仔细掰扯掰扯。首先要明确一个概念:“老旧”的定义。在那个时代,海军军舰的更新换代速度虽然比现在慢,但也不是一成不变。一艘军舰的“老旧”程度,主要看几个方面: 设计年代和建造年份: 这是最直观的。19世纪.............
  • 回答
    三国时期,群星璀璨,名将谋士辈出,他们的真实能力在整个中国历史上都占据着举足轻重的地位。如果非要给他们一个“历史水平”的定位,那只能说是“顶尖的、划时代的”。不过,具体到个人,自然有高下之分,而且评价标准也并非单一。我们不妨从几个维度来细细道来:一、 军事统帅能力:战略的制定者与战场的主宰者能被后世.............
  • 回答
    听到你遭遇了这样的事情,我感到非常难过和担忧。在你不情愿的情况下发生关系,无论对方是谁,这都构成了一种严重的侵犯,是违背你的意愿的。这到底算什么性质?这是一种性侵犯。无论你们是什么关系,男朋友也好,丈夫也好,任何人在对方明确表示不愿意的情况下强迫发生性关系,都是违法的,也是对个人权利和尊严的严重践踏.............
  • 回答
    .......
  • 回答
    .......
  • 回答
    中国崛起后,其地位将是多元且深刻的,远不止于经济实力的简单增长。完成崛起,则是一个持续演进、动态定义的过程,而非一个固定终点。中国崛起后的地位猜想:1. 全球规则的积极塑造者而非被动接受者: 经济层面: 中国将不仅仅是世界工厂或大宗商品消费国,而是全球产业链、供应链重塑的关键力量。它会.............
  • 回答
    我想,“不错的生活”这个词,每个人心中都有自己独特的模样。对我来说,它不是那种电视剧里光鲜亮丽、事事顺心的剧情,也不是什么一夜暴富的童话。它更像是一首舒缓的曲子,有起伏,有节奏,但总体是和谐的,能让你感到安心和满足。首先,身体得是个健康的皮囊。这听起来很直白,但实际操作起来却不容易。所谓健康,不是不.............
  • 回答
    毕业前,要想真正地“走出校园,融入社会”,需要的不仅仅是专业知识的巩固,更重要的是一系列与社会接轨的实用技能。这些技能就像是打开社会大门的钥匙,让你从象牙塔的安逸走向现实世界的挑战与机遇。下面我来详细说说,哪些是毕业前你一定要好好打磨的。一、沟通与人际关系构建:打通信息壁垒,建立连接这绝对是第一位的.............
  • 回答
    .......
  • 回答
    .......
  • 回答
    关于耳放的输出阻抗和耳机阻抗的匹配问题,这确实是很多烧友在玩HiFi时常常会纠结的点。简单来说,它关系到你的耳机能不能被耳放“喂饱”,以及声音的整体表现。我们不妨掰开了揉碎了聊聊这个话题。到底怎样的耳放输出阻抗才算是与耳机阻抗良好的匹配?首先,要明确一个核心概念:匹配不是绝对的,而是相对的,并且要看.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有