Quora年度精选2015(CS)


        最近开始使用Quora,也就是国外版的知乎,只不过知乎出现在Quora之后。follow了几个很有趣的答主,也看到了一些很有意思的答案。在这里发现了What are Quora’s best answers of 2015?,于是陆陆续续翻译几个里面的答案。以下是Computer Science 部分。


使用MacBookAir编程好不好?

Is the MacBook Air good for programming?



对于大多数的编程,Macbook Air已经足够强大了。

这是我工作室里的MacBook Air。

而且在最后三年,macbook air是我唯一的计算机。

顶配和可扩展内存共花费了1500刀。

我已经用了将近总共8000个小时,算下来不到0.2刀每小时。

以下是我为什么推荐购买macbook air而不是其他笔记本电脑的原因。

  • 类UNIX系统。 OSX-作为mac的操作系统-结合了windows的实用性和Linux的UNIX兼容性。我并没有夸大UNIX开发环境的重要性。

  • 续航。 当我第一次拿到macbook air的时候,我不需要给他充电这让我可以完全专注10小时的编程。即使是今天,电池也还可以持续六个小时。

  • 轻便。 我经常到处跑。他让我在旧金山市中心3公里以内穿梭得最快。一个非常轻便的笔记本使这变得简单。(此处为敬礼同学订正)

  • 可支付得起的。 macbook air大概比MacBookPro(如果你要做一些影视编辑)便宜1000刀左右。

如果你要做一些天文学般的计算(计算量很大)或者跑一些很庞大但效率低的算法程序,MacBookAir应该可以完全可以满足你的编程需求。

10.21.2015更新

我的朋友 Peter benjamin 说2015年的顶配13寸MacBookAir和普通的Retina13寸MacBookPro价格差不多,下面是他们配置的对比。

顶配13寸MacBookAir:

  • 2.2 Ghz主频 双核i7处理器
  • 8GB 1600Mhz 内存
  • 256 GB 固态硬盘
  • 1450刀

普通13寸Retina的MacBookPro:

  • 2.7 Ghz 双核i5处理器
  • 8GB 1866Mhz 内存
  • 256 GB 固态硬盘
  • 1500刀

如果你对略重和稍少一些的续航不是很介意,你可能更喜欢贵一些的MacBookPro的表现。






学习编程最不好的方式是什么?

What’s the worst way to learn programming?



我通过视频教授人们编程,也一对一的的上过课,我认为当人们想写大量笔记的时候通常就是一个不好的信号了,而当人们开始通过实践写下他们所想的时候就是一个好的信号。

最糟糕的事情莫过于就是在一些事情上困惑,而这本是你本可以写代码和实战的时间。编程是一个实践练习的技巧,你不能只通过看代码和弄明白来学习。你不得不去做,去完成它。

有些人说你应该通过一些算法书或别的书来入门,我不同意这些,除了那些非常想读这些书的人以外,因为通过大量写代码来学习计算机会更简单,而不是只是干燥的学习它们等到以后在用到它们。

有些人说这很功利,你不得不用功利的办法。听起来一开始会很诧异,很没意义,但实际上是很有意义的,我想这也适用于编程。

写在这里,关于评论中的观点,我并没有推荐在程序中使用hack直到他们在这工作。一旦你度过了最主要的部分,你不得不开始计划更多的程序,并且不得不学一些理论,我只是认为不写程序学编程不是一个好主意,你应该尽可能的将任何你所学进行实践.






如果在学java和python之间选择,我应该首先选择哪一个?

If I had to choose between learning Java and Python, what should I choose to learn first?



如果你从没编过程序,我通常会推荐java作为第一门语言。python是一门很好的语言,它的思想是让事情变得简单,但实际上我认为它让一些编程新手更难理解一些事情。新手会对一些事情很困惑因为python隐藏了太多的底层。

举个例子,看以下python代码:

x = 5
y = 2
z = x / y
print z

结果会输出2而不是2.5.
对于有经验的程序员,并不难理解。变量x,y是整数,所以z也变成了一个整数,所以2以后的数字被舍去了。

但是python把这些事情隐藏了,所以看起来就会很神奇。

而在java中,对一些变量的种类是什么会很明确,发生的时候也就不那么神奇了。


int x = 5;
int y = 2;
int z = x / y;
System.out.println(z);






我们为什么需要程序员,计算机不是能做得更好吗?

Why do we need coders and programmers? Can’t computers do this better?



当计算机可以做得更好的那一天就是他们推翻人类统治的时候——终结者或是黑客帝国里面的情况

当计算机有足够的才智可以写自己的软件的时候,你确定他们还会听从人类,为人类是从吗?


我们没有过这样的警告吗 AI is a bad bad thing for humans?


回到现实的地球,没有程序员不明白文字加工器不恩能够使作家淘汰,再厉害的计算机也不能让程序员淘汰。

因为程序员工作的本质并不是写代码,而是指出什么需要被编成制造出来。

尽管有可以维持让程序服从人类统治的的计算机,但还是需要弄明白人类真正想要什么。

这就是问题所在,即使我们准许计算机可以读取思想,但在人类头脑中显示的也就是“我想要类似quora的东西”而已。

计算机一会儿将会问出一些问题来弄明白更多细节:

Q:你是想要你一个类似quora的问答网站?

A:是的。

Q:你是想要完全和quora一样吗?

A:不,因为人们会认为我是公然抄袭。

Q:那你想要什么样的?

A:不知道,我需要想一想。

在弄明白人类想要什么上,计算机并不比人类做得好,因为人类直到他们把所想转化成所做时,才真正知道自己想要什么。

你可能会说 -“嘿,这就是我们为什么会有商业分析,交互设计等最新最酷的职位称呼来帮助我们解决这个问题!计算机不可以取代他们吗?”

是的,除此之外,还有一件事发生了,那就是弄明白什么一直是信息不够的。

分析师:我们需要建一个类似quora的问答网站,需要独特的表现,样子和用户感受。

开发者:很好,让我们在细节上在过一遍,在写答案的方面,你想要它表现怎样?

分析师:就和quora一样。

开发者:所以quora对长答案的所见即所得是失败的,这也一样吗?

分析师:不,我不想这样。

开发者:所以并不完全和quora一模一样

分析师:不是。。

开发者:我们应该谈论一下更多其他不同之处。举个例子,一旦发布了,quora不允许你撤回发布,你也想一样吗?

分析师:他们为什么这么做?

开发者:不知道,但他们是这么做的。

分析师:听起来不太好,我们不要那样。

开发者:他们也只允许分享到Twitter和facebook,你也想一样吗?

分析师:应该更好点吧。

开发者:确实应该更好一些,但是更多的按钮会占据更多的屏幕空间。

分析师:我们不能隐藏额外的按钮吗?

开发者:当然可以。但是我们需要决定如何隐藏和显示按钮,并且隐藏按钮时还要考虑到最好的用户体验。

在软件开发的过程中,需要考虑到像上文一样但要百万级别的问题,而且分析师还有开发者不了解的知识领域(即二者会有沟通困难的时候)。无论如何,软件开发的挑战是决定需要做什么,而这些事情是可以用代码解决的。

任何计算机都可以和人类一起写程序,如果只想为人类写代码而不需要换电池的话。

你确定你想和计算机交谈而不是人类吗?






成为一个好的程序员需要了解什么算法?

What algorithms should I know to become a good programmer?



我假定你知道至少一种编程语言和指针/对象的概念。我将要提到一些算法和数据结构来提升难度。

先从线性结构和算法开始。

  • 数组
  • 链表
  • 队列

然后引出主要的算法:

  • 排序 - 归并排序,插入排序,快速排序,反转次数
  • 矩阵乘法(如果只是知道算法而不实践它)
  • 基本的筛选
  • 包括乘除的组合数学
  • 对于GCD的几何算法,混合倒序,快速求幂
  • 斐波那契数的矩阵乘法
  • 概率论
  • 统计 - 均值,中位数,方差,贝叶斯定理

然后学习一些流行的算法技术:

  • 分治 - 二叉搜索,最大子串
  • 贪心算法 - 活动选择,霍尔曼编码
  • 动态规划 - 矩阵链乘积,背包
  • 线性规划 - 最大变量,线性时间排序
  • 字符串算法 - Manacher,LCS,编辑距离

然后是些经典的数据结构:

  • 树 - 二进制树,普通树,最低的共同祖先
  • 二叉搜索树 - 中序遍历,层次遍历,找到第k个最大的元素,直径,深度,节点的数量,等等。
  • 堆 - 数组实现,堆化,堆排序
  • 联合查找
  • 哈希表 - 线性探测,开放式解决,避碰

然后,你可以学习一下图像学:

  • 邻接表,邻接矩阵,加权边图
  • 基本遍历算法 - 广度优先搜索,深度优先搜索等
  • 最短路径查找算法 - Dijkstra算法,弗洛伊德沃肖尔,贝尔曼福特
  • 最小生成树 - 克鲁斯卡尔算法,普里姆算法
    这个时候,编程水平已经很不错了。已经比大多数的cs本科生水平高。如果想要了解学的更多就要深入探索和更多的阅读。

提前树和图表:

  • 平衡树 - AVL,红黑
  • 重轻分解,B +树,四叉树
  • 高级图形 - 最小割,最大流量
  • 最大匹配 - 霍尔的婚姻
  • 哈密顿圈
  • 边图/线图
  • 强连通分量
  • 占主导地位的子图,点覆盖,旅行商 - 近似算法

推进字符串算法:

  • 克努特莫里斯普拉特算法
  • 拉宾卡普算法
  • 尝试和压缩的尝试
  • 前缀树,后缀树,后缀自动化 - Ukkonen算法

高级数学运算:

  • 快速傅立叶变换
  • 素性测试
  • 计算几何 - 最近点对,Voronoi图,凸包

进阶:

  • 通过所有组合/排列迭代
  • 位操作

感谢敬礼同学的技术支持






C++适合入门吗?

Is C++ a good first programming language?



不,并且再进一步说,没有一门语言非常适合入门。原因很简单:“真实世界”语言为了满足应用里广泛并大量的需求而变得杂凑且实用,但是一门好的编程语言有一个简单的基本思想,但是为了给学生们介绍编程语言的一些常见概念,也就不能强迫他们去解决一些复杂的不适合放入简单基本思想的细节。

但是C++看起来更糟。我说过真实世界的语言是杂凑而实用的,C++的例子过于体现这些特点了,有太多的事情没有定义,没有具体说明,没有实现定义,这也就是C++能在每台机器上都运行很快的原因。由于向后兼容性,我们不能抛弃C的一些的东西。这也很大程度上使得特性如何呈现的一系列规则变得复杂,所以它几乎适用所有的使用方式。好的编程语言不应该有这些东西。






自学编程的程序员有哪些不好的习惯?

What are some bad habits that self-taught programmers develop?



一般来说,自学的极客程序员都可以很好的克服这些问题,但还是让我具体的分析下…

相比一些具体的习惯更多的还是一个观念。他们只是想让程序能跑起来并且尽可能跑的快。他们计划的内容(如果有的话)一般来说是在餐巾纸背面写几个大体的想法或是一个模糊的模型,如果有一些不顺利就会放弃,毕竟是他们自己的项目。

这是一种对任何事都很粗暴的方式。就像趟浑水一样。强行把自己推到足够远,遇到困境的时候就放弃。对小的项目这样还算可以,但如果复杂度很高的时候,这样就不行了。

当然,人们被教育成遇见什么事都要走捷径,他们也把这个当成信条。我遇见过一两个家伙,他们会考虑到几乎所有的细节并且花很多的时间将想法系统化,这会让他们很纠结。而当开始做的时候,需求又戏剧化的改变了,他们不得不重新开始。

生活中的大多事,走这两个极端都很不好,你必须拿捏好二者的分寸,这取决于你的项目。适度的规划,项目开始之前对于确定的功能做一些实验和测试,讨论和尽可能多的复用等,这就是我想说的。与此同时,别太让自己纠结,停滞不前。