热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

编程之美序

一位应聘者(interviewee)在我面前写下了这样的几行程序:while(true){if(busy)i;else}然后就陷入了沉思,良久&#x

一位应聘者 (interviewee) 在我面前写下了这样的几行程序:

while (true) {

  if (busy)  i++;
  else
}

然后就陷入了沉思,良久,她问道:else 怎么办?怎么能让电脑不做事情?

我说:对呀,怎么才能让电脑闲下来?你平时上课,玩电脑的时候有没有想过?这样吧,你可以上网查查资料。

她很快地在搜索引擎中输入“50%  CPU 占用率”等关键字,但是搜索并没有返回什么有用的结果。

在她忙着搜索的时候,我又看了一遍她的简历,从简历上可以看到她的成绩不错,她学习了很多程序设计语言,也研究过“设计模式”、“架构”、“ SOA”等,她对Windows、Linux 也很熟悉。我的面试问题是:“如何写一个短小的程序,让Windows的任务管理器显示CPU 占用率保持为50%?”这位应聘者尝试了一些方法,但是始终没有写出一个完整的程序。 面试的时间到了,她看起来比较遗憾,我也一样,因为我还有一系列的 后续问题没有机会问她:

· 如何能通过命令行参数,让CPU 的使用率在保持任意位置, 如90%?

· 如何能让CPU 的使用率表现为一条正弦曲线?

· 如果你的电脑是双核(dual-core),那你的程序会有什么样的结果?为什么?

作为面试者,我最希望看到应聘者能给出独具匠心的回答,这样我也能从中学到一些“妙招”。遗憾的是看到“妙招”的时候并不多。 自从2005年回到微软亚洲研究院担任开发经理一职以来,我面试过不少应聘者,也为微软校园招聘出过考题,做过员工和实习生的培训。我也了解到不少同学认 为软件开发的工作没意思,是“IT 民工”、“软件蓝领”。我和其他同事也听到一些抱怨,说一些高校计算机科学的教育只停留在原理,而忽视了对原理和技术的理解和运用。

写程序真的没有意思?为什么许多微软的员工乐此不疲?我和一些喜欢编程的员工和实习生编了这本书,这本书想通过分析微软面试中经常出现的题目,来展 示编程的乐趣。编程的乐趣在于探索,而不是在于背答案。面试的过程就是展现分析能力、探索能力的过程,在面试中展现的巧妙的思路,简明的算法,严谨的数学 分析就是我们这本书要谈的“编程之美”。

还有不少同学问:“你们是不是有面试题库?”  言下之意是每个应聘者都是从“库”中随机抽出一道题目,如果答对了,就中了,如果答错了,就bye-bye 了。书中的一些关于面试的问答,能回答这样一些疑惑。

本书的题目,一部分来源于各位作者平时自己的实践,例如有一次一位应聘者滔滔不绝地讲述自己如何在某大型项目中进行CPU压力测试,听上去水分不 少,我一边听一边琢磨“怎么才能考察是否真正懂了CPU,任务调度。。。。。。”,后来就有了上面提到的“CPU使用率”的面试题。有些题目在网上流传较 广,但是能得到正解的不多, 我们在书中加上了详细的分析,提出了一些扩展问题。有些题目在一些教科书和专业书籍中有更深入的分析和解答,读者可以参考。

书中的大多数题目都能在四十五分钟左右内解决,这也是微软一次技术面试的时间。 本书不是一个“答案汇编”,很多题目并没有给出完整的答案,有些题目还有更多的问题要读者去解答。这是这本书和其他书籍不一样的地方。 面试不是闭卷考试,如果大家都背好了“井盖为什么是圆的”的答案来面试,但是却不会变通,那结果肯定是令人失望的。 

为了方便读者评估自己的水平,我们还按照每道题目的难度制定了相应的“星级”:

·         一颗星:不用查阅资料,在20分钟内完成

·         两颗星:可以在40分钟内完成

·         三颗星:需要查阅一些资料,在60分钟左右完成

由于每个人的专业背景,经历,兴趣不一样,这种“星级”仅仅是一种参考。

我们的水平非常有限,书中的题目并不能代表程序设计各个方面的最新进展,虽然经过几轮审核,不少解法都可能有漏洞或错误,希望广大读者能给我们指正。我们计划在微软亚洲研究院的门户网站( www.msra.cn) 上开辟专栏和读者交流 – 初学者和高手都非常欢迎!

本书的内容分为下面几个部分:

·         玩电脑:电脑上的游戏是给人玩的,CPU 也可以让人‘玩’。这一部分的题目从游戏和作者平时遇到得的有趣问题出发,展现一些并不为人重视的问题,并且加以分析和总结。希望其中化繁为简的有趣思路能够对读者解决其它复杂问题有所帮助。

·         字符串和常用数据结构问题:对字符以及常用数据结构的处理几乎是每个程序中必然会涉及到的问题,这一部分汇集了常用的对字符串以及链表、队列以及树等操作的题目。

·         数字问题:编程的过程实际上就是和数字以及字符的打交道的过程。如何提高掌控这些数字和字符的能力对提高编程能力至关重要。这一部分收集了一些好玩的对数字进行处理的题目。

·         数学问题:书中还列了一些不需要写具体程序的数学问题,但是其中显示的原理和解决问题的思路对于提高思维能力还是很重要的,我们把它们单独列出。

·         关于笔试,面试,职业选择的一些问答:微软的各种技术职位,招聘流程是很多学生所关心的,因此我们把一些相关的介绍和讨论也收录了进来。

我们希望《编程之美》的读者是:

1. 计算机系、软件学院或相关专业的大学生、研究生,可以把这本书当作一个习题集。

2. 面临求职面试的IT从业人员,不妨把这本书当作“面试真题”,演练一下。

3. 编程爱好者,可以平时随便翻翻,重温数学和编程技能,开拓思路,享受思考的乐趣。

《编程之美》由下面几位作者协同完成,如果把这本书比作一个软件项目,它有下面的各个阶段,每个阶段有不同的目标和角色:

1. 构想阶段:邹欣

2. 计划阶段:邹欣,刘铁锋,莫瑜。

3. 实现阶段/里程碑(一):上述全部人员,加上李东,张晓,陈远,高霖 (负责封面设计)。

4. 实现阶段/里程碑(二): 上述全部人员,加上梁举,胡睿。

5. 稳定阶段:上述全部人员,加上博文视点的编辑们。

6. 发布阶段:邹欣,刘铁锋,和博文视点的编辑们。

这本书从2007年2月开始构思,到2007年11月底交出完整的第一稿,花费的时间比每一位作者预想的要长得多,一方面是大家都有日常的工作和学 习任务要完成;更重要的是,美的创造和提炼,是一个漫长和痛苦的过程。要把“编程之美”表达出来,不是一件容易的事,需要创造力、想象力和持久的艰苦劳 作。就像沈向洋博士经常讲的一句话——Nothing replaces hard work。

这本书的各位作者,都是利用自己的业余时间参与这个项目,他们的创造力、热情、执着和专业精神让这本书从一个模糊的构想变成了现实。 通过这次合作,我从他们那里学到了很多,借此机会,对所有参与这个项目的同仁们说一声: 谢谢!

在本书编写过程中,作者们得到了许多微软亚洲研究院的同事和实习生的帮助,具体请参见“致谢”。

我们希望书中展现的题目和分析,能像海滩上美丽的石子和漂亮的贝壳那样,反映出造化之美,编程之美。

 
推荐阅读
  • 帝国CMS中的信息归档功能详解及其重要性
    本文详细解析了帝国CMS中的信息归档功能,并探讨了其在内容管理中的重要性。通过归档功能,用户可以有效地管理和组织大量内容,提高网站的运行效率和用户体验。此外,文章还介绍了如何利用该功能进行数据备份和恢复,确保网站数据的安全性和完整性。 ... [详细]
  • 深入解析Linux内核中的进程上下文切换机制
    在现代操作系统中,进程作为核心概念之一,负责管理和分配系统资源,如CPU和内存。深入了解Linux内核中的进程上下文切换机制,需要首先明确进程与程序的区别。进程是一个动态的执行流,而程序则是静态的数据和指令集合。进程上下文切换涉及保存当前进程的状态信息,并加载下一个进程的状态,以实现多任务处理。这一过程不仅影响系统的性能,还关系到资源的有效利用。通过分析Linux内核中的具体实现,可以更好地理解其背后的原理和技术细节。 ... [详细]
  • 在最近的WWDC17大会上,苹果公司宣布了多项重要更新,其中一项是macOS High Sierra 10.13 Final的正式发布。这一版本经过优化,显著提升了系统的稳定性和响应速度,为用户在任何Mac设备上提供了更加流畅的使用体验。本文将详细介绍如何在Windows系统中利用VMware虚拟机软件安装并运行macOS High Sierra 10.13 Final,帮助用户在非苹果硬件上体验这一先进操作系统。 ... [详细]
  • Parallels Desktop for Mac 是一款功能强大的虚拟化软件,能够在不重启的情况下实现在同一台电脑上无缝切换和使用 Windows 和 macOS 系统中的各种应用程序。该软件不仅提供了高效稳定的性能,还支持多种高级功能,如拖放文件、共享剪贴板等,极大地提升了用户的生产力和使用体验。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • Java Socket 关键参数详解与优化建议
    Java Socket 的 API 虽然被广泛使用,但其关键参数的用途却鲜为人知。本文详细解析了 Java Socket 中的重要参数,如 backlog 参数,它用于控制服务器等待连接请求的队列长度。此外,还探讨了其他参数如 SO_TIMEOUT、SO_REUSEADDR 等的配置方法及其对性能的影响,并提供了优化建议,帮助开发者提升网络通信的稳定性和效率。 ... [详细]
  • 在《ChartData类详解》一文中,我们将深入探讨 MPAndroidChart 中的 ChartData 类。本文将详细介绍如何设置图表颜色(Setting Colors)以及如何格式化数据值(Formatting Data Values),通过 ValueFormatter 的使用来提升图表的可读性和美观度。此外,我们还将介绍一些高级配置选项,帮助开发者更好地定制和优化图表展示效果。 ... [详细]
  • 深入解析Android 4.4中的Fence机制及其应用
    在Android 4.4中,Fence机制是处理缓冲区交换和同步问题的关键技术。该机制广泛应用于生产者-消费者模式中,确保了不同组件之间高效、安全的数据传输。通过深入解析Fence机制的工作原理和应用场景,本文探讨了其在系统性能优化和资源管理中的重要作用。 ... [详细]
  • 使用 ListView 浏览安卓系统中的回收站文件 ... [详细]
  • MATLAB字典学习工具箱SPAMS:稀疏与字典学习的详细介绍、配置及应用实例
    SPAMS(Sparse Modeling Software)是一个强大的开源优化工具箱,专为解决多种稀疏估计问题而设计。该工具箱基于MATLAB,提供了丰富的算法和函数,适用于字典学习、信号处理和机器学习等领域。本文将详细介绍SPAMS的配置方法、核心功能及其在实际应用中的典型案例,帮助用户更好地理解和使用这一工具箱。 ... [详细]
  • 在 CentOS 7 系统中安装 Scrapy 时遇到了一些挑战。尽管 Scrapy 在 Ubuntu 上安装简便,但在 CentOS 7 上需要额外的配置和步骤。本文总结了常见问题及其解决方案,帮助用户顺利安装并使用 Scrapy 进行网络爬虫开发。 ... [详细]
  • 在C语言程序开发中,调试和错误分析是确保代码正确性和效率的关键步骤。本文通过一个简单的递归函数示例,详细介绍了如何编写和调试C语言程序。具体而言,我们将创建一个名为 `factorial.c` 的文件,实现计算阶乘的功能,并通过逐步调试来分析和解决可能出现的错误。此外,文章还探讨了常见的调试工具和技术,如GDB和断点设置,以帮助开发者高效地定位和修复问题。 ... [详细]
  • 在Linux系统中,网络配置是至关重要的任务之一。本文详细解析了Firewalld和Netfilter机制,并探讨了iptables的应用。通过使用`ip addr show`命令来查看网卡IP地址(需要安装`iproute`包),当网卡未分配IP地址或处于关闭状态时,可以通过`ip link set`命令进行配置和激活。此外,文章还介绍了如何利用Firewalld和iptables实现网络流量控制和安全策略管理,为系统管理员提供了实用的操作指南。 ... [详细]
  • 本文详细介绍了批处理技术的基本概念及其在实际应用中的重要性。首先,对简单的批处理内部命令进行了概述,重点讲解了Echo命令的功能,包括如何打开或关闭回显功能以及显示消息。如果没有指定任何参数,Echo命令会显示当前的回显设置。此外,文章还探讨了批处理技术在自动化任务执行、系统管理等领域的广泛应用,为读者提供了丰富的实践案例和技术指导。 ... [详细]
  • 深入理解排序算法:集合 1(编程语言中的高效排序工具) ... [详细]
author-avatar
cl357_475
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有