没有人是完全独立的孤岛,每个人都是整体的一部分。—— 约翰·多恩
对于缺乏编程知识的人来说,完全有可能编写一个网页或小程序。如果在用Google搜索相关示例时幸运的话,可以搜到现成的代码。即使是经验丰富的程序员,通常也会为了节省时间和精力而在网上搜索解决方案。
如果不借助搜索技术、网络及集体智慧,现代化高效编程是难以想象的。因此,搜索技巧对高效程序员变得愈发重要。
现在,我们不需要了解和记住如何解决众多的编程问题,可以采用搜索技术。我们正变得更加高效、高生产力,并能够解决更多的问题。但这是否意味着在构建软件时,拥有好的搜索技巧就足够了呢?本文将讨论,搜索技巧在程序员知识的形成过程中的作用,以及如何高效使用搜索技巧。
知识的类型及它在程序员大脑中如何成长。
有三类知识:
概念知识(为什么、是什么、如果—— 语义上的)——理解软件系统构建过程中的概念、原理、关系及主要方法。根据这类知识,能够找出体系结构或代码必须按特定方式设计的原因,以及从中选择最佳设计方案的备选方案和逻辑是什么。概念知识,不是指用特定编程语言解决特定问题,而是对问题的长远看法和理解。
- 用途:对复杂的开放式问题寻找新的解决方案,并创建稳健的软件系统。
- 收获:学习计算机科学、体系结构以及编程概念,在实际实现和经验的基础上,构建自己的理论。
实践性知识(如何做 —— 过程中的)—— 关于如何解决特定编程问题的知识。这类知识不需要深入理解实现方法选择过程中隐含的概念及基本原理。搜索技术在这里最重要,因为对有限的编程语言问题所采取的特定解决方案,搜索能相对容易的加以共享并说明。
- 用途:用已证实的和已知的解决方案快速解决问题,而不是每次都重新发明一种新的方法。
- 收获:搜索现有的解决方案,通过例子学习或提出自己的解决方案并以后对其重利用。
隐性知识(专业知识、经验及直觉)——基于软件系统实现过程中所积累的个人经验,在大脑中形成的内在知识。通过强大的大脑功能,隐性知识可以综合并协调其他两种知识。这类知识很难传授,因为它的大部分都存储在我们的潜意识中。在特定环境下,它和直觉一同发挥作用,能够在经验、对概念性和实践性知识的反馈和评估的基础上,制定最佳决策。
- 用途:利用自己的专长、经验及直觉来实现最佳解决方案。
- 收获:构建软件并从结果中学习知识。
设计模式(还有架构、领域及其他)是不同类型知识相结合的有趣的例子:“如何做”的例子,这些例子中隐含的概念及实现过程中积累的经验。这种知识的表现方式是模式成功及广泛应用的原因之一。
随着越来越多的可供使用的实践性解决方案和示例出现在网络上,人们大脑中的实践性知识的价值越来越小。我们不需要记住实践性知识。现在我们能够处理软件构建过程中几乎所有可能遇到的常见编程问题。然而,除能够解决问题的示例或从哪搜索这些示例以外,一名大师级的程序员还知道更多的知识。他能够提出自己的解决方案,制定大部分最佳决策,并采用最好的方式应用它们。此外,很难在网上找到新的、复杂的、领域性的及特定环境下的问题的解决方案。而且,对所有重要的软件工程,在制定优秀解决方案的过程中,都需要高水平的软件开发理论、这些理论的应用经验、对系统的深入了解、问题空间及环境等相关知识。
因此,在软件开发过程中,概念知识和隐性知识仍然是非常重要的。在使用搜索技术时,我们应当努力扩充各种知识,而不是仅仅解决特定问题。随着解决更高级问题的能力的提高,你会取得成功,成为更高效的程序员。
可解决实际问题的高效搜索
A. 查找
- 1. 定义——弄清楚要解决什么问题,并以要查找的内容为焦点。网络上有如此多的有趣的材料,以至于搜索过程能轻易地占掉你全部的工作时间(和个人时间)。
- 2. 检索(使用标准的Google、代码搜索或其他的检索引擎)—有很多关于如何高效的使用检索引擎的建议。
- 3. 浏览结果(内容的质量、可信度及专业技术的水平;如果资料的可信度过低,无须再看)-> 阅读 -> 评估(人力物力、所需工具及函数库)
B. 使用
- 1. 复制代码 – 单独复制(针对这一目的,带有长钉技术的显式单元测试最适合)
- 2. 清除代码 – 仅保留最小限度、相关性代码,清除解决方案中的其它代码。
- 3. 在系统中应用代码。
C. 学习
- 1. 理解——你做了什么及你为什么那样做——从代码和实现中学习。
- 2. 扩充知识——
- a. 实践性知识:解决问题的特定方法、技巧及风格;
- b. 概念知识:学习新概念、提炼现有的并构建自己的概念;
- c. 隐性知识:明智地使用并学习搜索到的解决方案,经验会自然而然地得到增长。
- 3. 收集(链接、意见、参考文献、阅读清单)—任何对你今后搜索、发现及学习有用的有趣信息。为这些目标积累知识。
你还有其他高效搜索代码的诀窍吗?欢迎在评论或微博中和大家分享。
马上到年末了,自己也对今年做了一下总结,自己有哪些优点,有哪些还需要加强。每当我想到今年比较满意的地方,对比之前,就会有这样一个思考:如果以前的我要是知道这些该多。在这里给大家分享一下经验,让新人少走一些弯路。
做事要积极主动,态度决定一切
说这些,可能有人会觉得,这些都明白,都是大道理,只是怎么样执行的问题,下面我举一个真实的例子。
我曾经带过的两位新人,A君上班,交代给他负责的东西,是永远没有结果的,我交代给A做一个数据展现的部分,A君告诉我他不会JSP的技术,我给他 推荐了一些书籍以及我曾经写过的demo,并告知不能光学,要有成果展示,可以通过这个数据展现来学习jsp技术,但是最后的结果是他下班就走,走之前没 有跟我汇报任何进度,我最后只能换人做这个东西。这里我并不是推荐职场新人要加班,但是做事的态度要认真负责,新人可以对技术不懂,但是要有负责的态度, 起码应该汇报一下今天的进度。
再来对比一下另一位B君,也是同样接到这个任务,首先B君懂jsp,但是他不懂JSTL,我给了他时间学习,结果B君在很短的时间内,学了JSTL 并将总结发给了我,我相信这么短的时间内,他毕竟掌握的有限,但是学习了,又有总结,这种态度令我非常满意。在第二天,B君就把数据展示做出来了,而且确 实是我想要的样子!不得不说,同样的事,同一水平线,不同人做的时候,态度和积极性就决定着一切,所以一个人只要工作态度好,我相信这个人的工作绝对不会 差。
提问的技巧
作为一个新人来说,不懂就要问!这里我要说两点:
1、 如果是单纯技术上的问题,如果可以google到的,我认为就可以自己消化掉!问的问题一定要先google,然后带着自己的想法,去问一些有经验的人,收获会更大!(推荐阅读:《如何使用搜索技巧来成为一名高效的程序员》)
举个例子:曾经的我,埋头写代码,那时候很怕上司知道自己不会这,不会那!所以拼命的掩盖自己不会的东西,自己查资料,下班了问同学,上论坛发问。 但是由于逻辑和现实需求不一样,所以结果并不理想!如果那个时候,我把自己不理解的地方和上司谈,也许会很快的就能完成这个任务,而不是返工。
2、如何提问?问谁?
很多新人不知道如何提问,也不知道问谁。我的建议是,先把你要问的问题梳理好,最好可以有电子版或者打印版的整理,方便其他同事查看和解答。然后就是提出的问题,要让回答的人感兴趣,这样他不但会给你解答问题,还有可能将问题延伸,让你学到更多的知识。对于如何让回答的人感兴趣,就是仁者见仁,智者见智了!看个人发挥了!
对于问谁,我觉得你不了解其他同事的时候,要先问你的上司,当你了解了你的同事每个人擅长的领域之后,就应该把自己的问题归类,然后问最擅长的人。这样会事半功倍!
任务分解
不知道大家做事都是怎样一个逻辑,当年的我做事就是一团糟。当我拿到一个日志分析的任务的时候,就想着做,埋头苦干,但是自己越做,脑子越浑,完全 找不到头绪。后来,上司找到我,给我做出了任务分解,我按照任务分解来做,清晰了很多。直到现在,我还保持着做任务分解的习惯。
其实做任务分解可以帮助你更深入的了解你要做的事情,任务分解包括一个事情,你需要分几个步骤去做,每个步骤要做到什么样子,什么程度,多长时间做 完。几个步骤为一个里程碑。如果具体做的时候发现一个步骤的事情做起来超过了一个星期,我觉得这属于任务分解的不够细,需要将这个任务再次分解,让你的工 作更透明,更有效率。可以使用一些任务分解工作,将自己的工作路线和步骤明确,要善用工具。
主动汇报 + 主动沟通
曾经的我就是埋头苦干,但是从不汇报进度,其实这样是不好的。后来我的领导找到我,问我的进度,才发现意见有所分歧,理解有差距。索性只能重新来过。
新人一定要注意这个事情,有情况,有成果,有可展示的东西就一定要及时的主动汇报这个事情的进度,做成果展示,在对事情有不理解的时候也需要主动的沟通,使之和所有参与人员的意见一致再去做,保证你做的事情的正确性和有效性。
记住一句话:当领导找到你问进度的时候,你是被动的!
上面几点,看似简单,做起来很难!到现在任务分解和提问很多职场新人是不具备的,需要慢慢磨练,但是我们相信,只要有良好的态度,良好的习惯,工作一定会慢慢越来越好!相信自己的明年会越来越好!