编程能力是一种解决问题的能力。若是问题没能被很好地解决,知道再多也没用。程序员
编程能力是一种运用机器解决问题的能力。首先是要判断问题在什么程度上可被机器解决,好比理论计算机科学会告诉咱们什么可作、什么理论上不可作、什么理论上可作实践上不可作。而后是让机器更好地理解问题,好比计算机都是(图灵-冯诺依曼模型)等价,但不一样的问题可能会适用不一样的编程语言。再后是让机器能更高效率地解决问题,好比一样的问题可能会有效率差异巨大的算法。
编程能力是一种抽象问题的能力。借用轮子是很好的办法,省力省时间。今天任何软件工程师都会有意无心地使用不少轮子,从操做系统编译器数据库网络到算法数据结构。想高效地借用轮子,就须要将问题分解再分解,抽象再抽象。任何一个实用的系统(不包括教科书上的示例程序和简单的脚本程序)都须要进行大量的分拆和组合。因此系统设计是编程能力里的高级技能,加合理的假设简化问题尤为有难度,此处不展开讨论。高手和新手的区别在于新手每每不知道轮子的适用范围,而高手的手上轮子数量多且熟知各类轮子的差别,因此对不一样的问题能够轻松地找到合适的轮子,当实在找不到合适的轮子时能够本身动手改造现有的轮子。平时有时间拆装和改造已有的轮子会对水平提高有较大帮助。固然能知道怎样快速在搜索引擎里搜出轮子也是一种能力。
编程能力是一种须要考虑扩展性的能力。算法竞赛中的不少算法考虑的是单机的内存算法,计算模型通过高度抽象,在实践中机器的模型更为复杂。好比单机的多级结构带来的各类时间空间复杂度的取舍平衡,多机网络中如何能在提升单机性能外进一步优化总体性能。除了在机器端的扩展,在程序员一端的扩展也很重要。复杂的问题和工程每每意味着团队协同以及更长时间的开发维护,团队分工和设计沟通这里暂且不论。举个容易被忽视的例子,程序中的注释。高手会更在乎完整且表达清楚的注释,由于这是写给如今和将来的团队(包括本身和其余成员)看的,直接影响到长期的总体开发维护效率。
编程能力是一种取舍的能力。局部的最优解未必是全局的最优解。若是一个美妙的解决方案须要将完工时间向后推迟一两个月,须要考虑是否先使用平凡方案解决问题,以后再进行优化。当你的工做延后会阻碍别人的工做时尤为如此。发现一个绝妙的优化方案时先想一想这个优化是否真的有价值,若是只是系统中很小的部分,那么不要为了追求心理知足而花不少时间放一个漂亮的轮子上去(参考Amdahl定律)。
编程能力是一种预见将来的能力。目前的方案有哪些假设和局限性,在何种情形下会遇到问题甚至崩溃。在将来出现问题时问题是否须要从新定义,系统是否须要从新设计,代码是否须要重构或优化等等都须要未雨绸缪。
编程能力是一种工程能力。无它,惟手熟尔。
编程能力是一种解决问题的能力。若是问题没能被很好地解决,知道再多也没用。
编程能力是一种解决问题的能力。若是问题没能被很好地解决,知道再多也没用。算法