编程是学些什么东西?

在 2017 年,我参加了 ‘计算机行业中的女性’ 的Grace Hopper 庆祝活动。这个活动是这类科技活动中最大的一个。共有 17,000 名女性IT工作者参加。

这个会议有个大型的配套招聘会,会上有招聘公司来面试会议参加者。有些人甚至现场拿到 offer。我在现场晃荡了一下,注意到一些应聘者看上去非常紧张忧虑。我还隐隐听到应聘者之间的谈话,其中一些人谈到在面试中做的并不好。

我走近我听到谈话的那群人并和她们聊了起来并给了一些面试上的小建议。我想我的建议还是比较偏基本的,如“(在面试时)一开始给出个能工作的解决方案也还说的过去”之类的,但是当她们听到我的一些其他的建议时还是颇为吃惊。

为了能更多的帮到像她们一样的小白面试者,我收集了一些过去对我有用的小点子,这些小点子我已经发表在了 prodcast episode 上。它们也是这篇文章的主题。

为了实习生职位和全职工作,我做过很多次的面试。当我还在大学主修计算机科学时,学校每个秋季学期都有招聘会,第一轮招聘会在校园里举行。(我在第一和最后一轮都搞砸过。)不过,每次面试后,我都会反思哪些方面我能做的更好,我还会和朋友们做模拟面试,这样我就能从他们那儿得到更多的面试反馈。

不管我们怎么样找工作: 工作中介、网络,或者学校招聘,他们的招聘流程中都会涉及到技术面试:

近年来,我注意到了一些新的不同的面试形式出现了:

  • 与招聘方的一位工程师结对编程
  • 网络在线测试及在线编码
  • 白板编程(LCTT 译注: 这种形式应该不新了)

我将重点谈谈白板面试,这种形式我经历的最多。我有过很多次面试,有些挺不错的,有些被我搞砸了。

首先,我想回顾一下我做的不好的地方。知错能改,善莫大焉。

当面试者提出一个要我解决的问题时, 我立即马上立刻开始在白板上写代码,什么都不问。

没有澄清对解决问题有关键作用的信息

比如,我们是否只用处理数字或者字符串?我们要支持多种数据类型吗?如果你在开始解题前不去问这些问题的话,你的面试官会有一种不好的印象:这个人在我们公司的话,他不会在开始项目工作之前不问清楚到底要做什么。而这恰恰是在工作场合很重要的一个工作习惯。公司可不像学校,你在开始工作前可不会得到写有所有详细步骤的作业说明。你得靠自己找到这些步骤并自己定义他们。

只会默默思考,不去记录想法或和面试官沟通

在面试中,很多时候我也会傻傻站在那思考,什么都不写。我和一个朋友模拟面试的时候,他告诉我因为他曾经和我一起工作过所以他知道我在思考,但是如果他是个陌生的面试官的话,他会觉得我正站在那冥思苦想,毫无头绪。不要急匆匆的直奔解题而去是很重要的。花点时间多想想各种解题的可能性。有时候面试官会乐意和你一起探索解题的步骤。不管怎样,这就是在一家公司开工作会议的的普遍方式,大家各抒己见,一起讨论如何解决问题。

在你开始写代码之前,如果你能总结一下要使用到的算法就太棒了。不要上来就写代码并认为你的代码肯定能解决问题。

对我来说,我会首先通过一些例子来视觉化我要解决的问题。比如说如果这个问题和数据结构中的树有关,我就会从树底层的空节点开始思考,如何处理一个节点的情况呢?两个节点呢?三个节点呢?这能帮助你从具体例子里抽象出你的解决方案。

在白板上先写下你的算法要做的事情列表。这样做,你往往能在开始写代码前就发现 bug 和缺陷(不过你可得掌握好时间)。我犯过的一个错误是我花了过多的时间在澄清问题和头脑风暴上,最后几乎没有留下时间给我写代码。你的面试官可能没有机会看你在白板上写下代码,这可太糟了。你可以带块手表,或者房间有钟的话,你也可以抬头看看时间。有些时候面试者会提醒你你已经得到了所有的信息(这时你就不要再问别的了),“我想我们已经把所有需要的信息都澄清了,让我们写代码实现吧”。

2、 开始写代码,一气呵成

如果你还没有得到问题的完美解决方法,从最原始的解法开始总是可以的。当你在向面试官解释最显而易见的解法时,你要想想怎么去完善它,并指明这种做法是最原始的,未加优化的。(请熟悉算法中的 O() 的概念,这对面试非常有用。)在向面试者提交前请仔细检查你的解决方案两三遍。面试者有时会给你些提示, “还有更好的方法吗?”,这句话的意思是面试官提示你有更优化的解决方案。

当你在编码时,对你想做错误处理的代码行做个注释。当面试者说,“很好,这里你想到了错误处理。你想怎么处理呢?抛出异常还是返回错误码?”,这将给你个机会去引出关于代码质量的一番讨论。当然,这种地方提出几个就够了。有时,面试者为了节省编码的时间,会告诉你可以假设外界输入的参数都已经通过了校验。不管怎样,你都要展现你对错误处理和编码质量的重要性的认识。

编码完成后,用你在前面头脑风暴中写的用例来在你脑子里“跑”一下你的代码,确定万无一失。例如你可以说,“让我用前面写下的树的例子来跑一下我的代码,如果是一个节点是什么结果,如果是两个节点是什么结果……”

在你结束之后,面试者有时会问你你将会怎么测试你的代码,你会涉及什么样的测试用例。我建议你用下面不同的分类来组织你的错误用例:

对于性能测试,要考虑极端数量下的情况。例如,如果问题是关于列表的,你可以说你将会使用一个非常大的列表以及的非常小的列表来测试。如果和数字有关,你将会测试系统中的最大整数和最小整数。我建议读一些有关软件测试的书来得到更多的知识。在这个领域我最喜欢的书是 《我们在微软如何测试软件》。

对于错误用例,想一下什么是期望的错误情况并一一写下。

对于正向期望用例,想想用户需求是什么?你的解决方案要解决什么问题?这些都可以成为正向期望用例。

“你还有什么要问我的吗?”

面试最后总是会留几分钟给你问问题。我建议你在面试前写下你想问的问题。千万别说,“我没什么问题了”,就算你觉得面试砸了或者你对这间公司不怎么感兴趣,你总有些东西可以问问。你甚至可以问面试者他最喜欢自己的工作什么,最讨厌自己的工作什么。或者你可以问问面试官的工作具体是什么,在用什么技术和实践。不要因为觉得自己在面试中做的不好而心灰意冷,不想问什么问题。

关于找工作和申请工作,有人曾经告诉我,你应该去找你真正有激情工作的地方。去找一家你喜欢的公司,或者你喜欢使用的产品,看看你能不能去那儿工作。

我个人并不推荐你用上述的方法去找工作。你会排除很多很好的公司,特别是你是在找实习工作或者入门级的职位时。

你也可以集中在其他的一些目标上。如:我想从这个工作里得到哪方面的更多经验?这个工作是关于云计算?Web 开发?或是人工智能?当在招聘会上与招聘公司沟通时,看看他们的工作单位有没有在这些领域的。你可能会在一家并非在你的想去公司列表上的公司(或非盈利机构)里找到你想找的职位。

在这家公司里的第一个组里呆了一年半以后,我觉得是时候去探索一下不同的东西了。我找到了一个我喜欢的组并进行了 4 轮面试。结果我搞砸了。

我什么都没有准备,甚至都没在白板上练练手。我当时的逻辑是,如果我都已经在一家公司干了快 2 年了,我还需要练什么?我完全错了,我在接下去的白板面试中跌跌撞撞。我的板书写得太小,而且因为没有从最左上角开始写代码,我的代码大大超出了一个白板的空间,这些都导致了白板面试失败。

我在面试前也没有刷过数据结构和算法题。如果我做了的话,我将会在面试中更有信心。就算你已经在一家公司担任了软件工程师,在你去另外一个组面试前,我强烈建议你在一块白板上演练一下如何写代码。

对于换项目组这件事,如果你是在公司内部换组的话,事先能同那个组的人非正式聊聊会很有帮助。对于这一点,我发现几乎每个人都很乐于和你一起吃个午饭。人一般都会在中午有空,约不到人或者别人正好有会议冲突的风险会很低。这是一种非正式的途径来了解你想去的组正在干什么,以及这个组成员个性是怎么样的。相信我,你能从一次午餐中得到很多信息,这可会对你的正式面试帮助不小。

非常重要的一点是,你在面试一个特定的组时,就算你在面试中做的很好,因为文化不契合的原因,你也很可能拿不到 offer。这也是为什么我一开始就想去见见组里不同的人的原因(有时这也不太可能),我希望你不要被一次拒绝所击倒,请保持开放的心态,选择新的机会,并多多练习。

本文由 LCTT 原创编译,中国 荣誉推出

本文地址:编辑:清蒸github,审核员:逄增宝

本文原创地址:编辑:清蒸github,审核员:暂无

}
如果想做程序员就应该掌握以下的东西: 
的基础,所以C++是大多数程序员的必经之路)
}

spContent=计算机已经是“无所不能”,而每一项神奇的功能背后都有一系列计算机程序在运行。如今,电脑、智能手机的普及,每个人都可为计算机创造更加神奇的功能。学习程序设计,你也做得到。

    本课程以C++语言为载体,讲授计算机程序设计,为更好地利用计算机解决工程实践、科学研究和日常生活中的问题打下基础。
从程序设计方法角度分,计算机语言有面向过程的和面向对象的。面向过程的思想是将任务分解成一系列的函数,函数通过相互调用联系起来完成任务。面向对象的思想是将任务分解成一系列对象,对象具有功能。对象间通过消息传递信息,触发事件,完成任务。面向对象的语言被认为具有更好的重用性、可维护性和可扩展性。C++是面向对象的语言。但也要注意,面向过程和面向对象不是截然分开的,不是对立的。面向过程是面向对象的基础。本课程前半部分的编程思想仍是面向过程的,这对初学者更容易入门;后半部分是面向对象的,为进一步学习奠定基础。
    学习程序设计,要学习语言的语法,更重要的是求解问题的算法思想。语法的学习需要多尝试,算法的学习需要多思考。学习程序设计,就要多编程。

本课程面向零基础同学。学习过“大学计算机基础”或其他计算机课程对学习有帮助,但不是必要的。

为积极响应国家低碳环保政策, 2021年秋季学期开始,中国大学MOOC平台将取消纸质版的认证证书,仅提供电子版的认证证书服务,证书申请方式和流程不变。

电子版认证证书支持查询验证,可通过扫描证书上的二维码进行有效性查询,或者访问 https://www.icourse163.org/verify,通过证书编号进行查询。学生可在“个人中心-证书-查看证书”页面自行下载、打印电子版认证证书。

完成课程教学内容学习和考核,成绩达到课程考核标准的学生(每门课程的考核标准不同,详见课程内的评分标准),具备申请认证证书资格,可在证书申请开放期间(以申请页面显示的时间为准),完成在线付费申请。

认证证书申请注意事项:

1. 根据国家相关法律法规要求,认证证书申请时要求进行实名认证,请保证所提交的实名认证信息真实完整有效。

2. 完成实名认证并支付后,系统将自动生成并发送电子版认证证书。电子版认证证书生成后不支持退费。

[6] 陈锐,华庆一等.最新C/C++函数与算法速查速用大辞典. 中国铁道出版社,2015.9

Q: 本课程的选课条件是什么?
A: 本课程预计的主要对象是大学本科生,但不限于大学生。只要你有热情,有决心,就能学好。如果在大学学了“大学计算机基础”或接触过其他语言的程序设计,对本课学习会有所帮助,但这不是必要的,更不是充分的。

Q: 初中生可以听么?
A: 初中有初中的学习任务,所以,首先建议初中生把初中的课程学好。如果学有余力或对程序设计特别有兴趣,可以学习本课程。只要坚持认真学习,多做练习,通过交流及时解决学习中的问题,一样可以学好。本课程已有不少初中同学完成了学习,而且成绩也很好。

Q:如何学好程序设计?
A:建议同学们在学习程序设计过程中,注意运用下面三种设计方法:
同学们初学程序设计,首先是模仿设计。所谓模仿就是参照某个成功的程序,做一些微小局部的改动,程序总体结构不变。
例如教材讲述了求1+2+3+……+100的程序编写,你可以模仿连加程序,尝试编写连乘1*2*3*……*10的程序。这个模仿只进行两个变化,一是加号改乘号;二是结果变量初始值由0改为1;三是循环截止由100改为10。
又例如教材介绍了两数求最大的程序,你可以模仿尝试编写求最小的程序。变化是小于号改为大于号。
又例如教材介绍日期结构体的程序,你可以模仿尝试编写时间结构体的程序,变化是输出日期和时间的格式不一样。
又例如教材介绍学生类的程序,你可以模仿尝试编写职员类的程序,比如仅仅变化学生的成绩属性为职员的薪水属性。
通过这样的模仿可以尽快掌握程序设计的基本方法。
一题多解是程序设计的特色之一。同样一个问题可以设计出多种求解算法,自然可以编写设计出许多种程序,都能正确求解这个问题。当然这些程序之间比较,可能一些程序运行速度快,一些程序占用空间少。例如求1+2+3+……+100的问题,就可以设计出三种不同算法:一是直接用公式计算;二是从头循环加到尾部;三是从尾部循环加到头。这样就可以编写设计出三个不同的程序。在学习程序设计时,不能满足于一种求解程序,而应该多做变换,比如语句变换,C++有三种循环语句,可以尝试相互代换。又比如数据类型或结构变换,这样就可以设计不同的程序,然后分析每个程序的时空效率。
    程序设计说穿了,就是让计算机按照你事先安排好的步骤进行求解工作。一个问题分几步求解,是由你来设计的。如何将问题分解成一个一个较小的子问题,是程序设计的核心。至于每个子问题涉及哪些数据类型?是采用函数结构,还是采用哪几条语句?就相对容易清晰了。同学们要善于分解,通过反复的训练,提高分解问题的能力。(顾老师)

Q:学习编程需要准备什么东西?
A:你可以拥有一台电脑,但不是必须的。学校的机房也是很好的去处,只要有电脑用就可以。对电脑的配置也没有要求,当前能用的电脑都可以。最好有个U盘之类的存储装置,将自己平时练习的程序保存下来,以备以后参考。保存在网上、保存在邮箱中也是不错的选择。教材或参考书应该有一本,一是编程前要阅读学习,二是在编程中经常需要查阅。

Q:学习C++程序设计使用什么软件好?
A:编程软件常常是各有优点。我们课程使用的是DEV C++。这是一款自由软件,使用简单,体积小,容易获得。其他的CodeBlocks、Visual C++6.0、VS2008~2012,Borland C++等都是很好的编程软件。有时间都熟悉一下是很好的选择,因为在考试、竞赛、招聘中会遇到各种不同的环境。

Q:课程结束后如何查看课程内容?

A:登录中国大学MOO C→ 点头像 → “我的课程” →已结束

Q:如何查看已结束的课程?

A:课程介绍页→课程图标下方(右上,开课时间上方)→“第**次开课”→选择“第8次开课”。

}

我要回帖

更多关于 怎么学编程 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信