6基本功v 进步创建出来两年就看里密密麻麻是我的自尊咩咩咩咩咩咩密密麻麻是我的自尊哦没

满咩咩满的推荐 | LOFTER(乐乎) - 记录生活,发现同好
LOFTER for ipad —— 记录生活,发现同好
满咩咩满 的推荐
&nbsp&nbsp被喜欢
&nbsp&nbsp被喜欢
{list posts as post}
{if post.type==1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type==2}
{if post.type == 3}
{if !!post.image}
{if post.type == 4}
{if !!post.image}
{if !!photo.labels && photo.labels.length>0}
{var wrapwidth = photo.ow < 500?photo.ow:500}
{list photo.labels as labs}
{var lbtxtwidth = Math.floor(wrapwidth*(labs.ort==1?labs.x:(100-labs.x))/100)-62}
{if lbtxtwidth>12}
{if !!labs.icon}
{list photos as photo}
{if photo_index==0}{break}{/if}
品牌${make||'-'}
型号${model||'-'}
焦距${focalLength||'-'}
光圈${apertureValue||'-'}
快门速度${exposureTime||'-'}
ISO${isoSpeedRatings||'-'}
曝光补偿${exposureBiasValue||'-'}
镜头${lens||'-'}
{if data.msgRank == 1}{/if}
{if data.askSetting == 1}{/if}
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post_index < 3}
{if post.type == 1 || post.type == 5}
{if !!post.title}${post.title|escape}{/if}
{if !!post.digest}${post.digest}{/if}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
{if drlist.length>0}
更多相似达人:
{list drlist as dr}{if drlist.length === 3 && dr_index === 0}、{/if}{if drlist.length === 3 && dr_index === 1}、{/if}{if drlist.length === 2 && dr_index === 0}、{/if}{/list}
暂无相似达人,
{if defined('posts')&&posts.length>0}
{list posts as post}
{if post.type == 2}
{if post.type == 3}
{if post.type == 4}
this.p={ dwrMethod:'querySharePosts', fpost:'1cb6',userId:,blogListLength:20};谢邀。对于个人来说,这是我在知乎上看到的最有价值的问题。&br&&br&补充一下quora上面的相关问题链接:&br&&a href=&///?target=http%3A///Programming-for-Kids/What-are-good-ways-to-teach-12-year-old-child-programming& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Programming for Kids: What are good ways to teach 12-year-old child programming?&i class=&icon-external&&&/i&&/a&&br&&br&另外补充几个相关的新闻链接:&br&&a href=&///?target=http%3A///article/2691.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&读读这3位年轻创业家的故事吧!13岁、16岁、22岁——可真够年轻的!&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///a/006.htm& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&下一代程序员是什么样子?&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///l.php%3Fl%3De& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&玩游戏学编程,Hopscotch让孩子变身小小程序员&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A//www.csdn.net/article//2814910-CloudFlare& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CloudFlare创始人传奇人生:7岁编程,法学博士,获哈佛商学院最高荣誉-CSDN.NET&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///content//07053.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&9岁女孩欲制作游戏 仅一天募资超10000美元&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///p/202470.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&打游戏学编程,不输代码就看机器人被干掉&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///p/202482.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&专注程序开发的视频教育网站Treehouse获700万美元B轮融资,将推出针对中学生的编程课&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Learn Web Design, Web Development, and More&i class=&icon-external&&&/i&&/a&&br&&a href=&///?target=http%3A///newseed/.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何培养下一代扎克伯格 专为孩子们准备的六大编程应用&i class=&icon-external&&&/i&&/a&&br&不过这个和codecademy不同,是付费网站。&br&只能说,跟老美相比,我们又落伍了。&br&&br&因为我这几年一直在搞iOS开发,也一直在努力尝试把教育和游戏结合在一起,提供寓教于乐的学习体验。对于知识教育(相对于教育的另一大核心人格教育),个人认为两点最重要,&br&&b&首先就是培养兴趣;&/b&&br&&b&其次就是培养自主学习和解决未知问题的能力。&/b&&br&&br&先不论年龄,既然你对语言和ios开发感兴趣,已经解决了最重要也是最难的一个问题。&br&那么接下来就是如何培养自主学习和解决未知问题的能力。&br&&br&&b&&u&根据你的描述,我提一下自己的建议,供你参考,但不一定适合你个人的特点:&/u&&/b&&br&&br&&b&1.说到语言,如果要学习编程和软硬件开发,首先要学的不是哪种编程语言,而是英语。&/b&&br&&br&没错,这是一个无奈的事实,除非有一天有哪位天才的中国黑客开发出基于中文自然语言的编程语言,并且让它被世人所接受。&br&当然,考虑到现在的中小学都已经开设了英语课程,这个看起来并非很大的障碍。事实则不然,很多大学生研究生包括毕业多年的老码农对英语的掌握都不行。当然,不乏很多高手牛人编程开发搞得好但英语很烂。但考虑到以下一些事实,个人认为适当提高下英语水平是很有必要的。&br&&br&(1)几乎所有重要语言,重要开发工具,开源项目都是在英文网站上以英文的形式展示。&br&以ios开发为例,苹果官方开发论坛,stack overflow,github,google code, source forge等等网站都是让自己成为iOS开发高手的极大帮助。&br&以创业为例,kickstarter,Y-Combinator等网站会帮助你实现自己的一个看似甚至荒谬的创意。&br&&br&(2)基于我朝特色,很多对于开发人员开发非常重要的社交网站和资源都必须翻墙获取,当然也都是英文的。&br&比如twitter,facebook,一些海外的极客,黑客论坛。&br&&br&(3)针对12岁这个年龄,很难找到针对性的语言和软件开发培养教程,但是这个问题对老外(特别是老美)根本不是问题。如果你的英语比较好,可以很轻松的通过twitter,facebook,论坛,编程网站找到适合自己年龄阶段的开发教程。我不想直接给你答案和链接,如果你真的对编程感兴趣,就要尝试着自己去寻找答案。&br&&br&绝大多数的老外牛人都是在12岁甚至更早的年龄开始了自己的编码和创造生涯,而其中的大多数则是从开发属于自己的游戏和小工具开始。那些名字都不用提了。&br&正因为如此,国外牛人和我们的差距至少是10年,不得不承认,这是一个可怕的数字。而且人最有想象力的年龄阶段正是在12岁前后,只会更早,而非20,30甚至40。&br&&br&当然,如果你对英语很头大,也可以跳过。不过我想引用allan kay的一句话,People who are really serious about &em&software&/em& should make their own &em&hardware&/em&. 真正喜欢软件的人会尝试着制造自己的硬件。这句话后面我还会引用,不过在这里其实想套用它的格式来一句,People who are really serious about programming should be familiar with English. 真正喜欢编程的人应该对英语很熟悉。&br&既然你有兴趣,还怕什么!&br&&br&那么如何提高英语水平?上课帮不了你任何忙,唯有兴趣。比如看看国外的电影,玩玩国外的游戏(英语单机或者外服),尝试着写自己的技术博客,多看国外的新闻,多去国外黑客极客喜欢的网站转。对于iOS开发来说,意味着多看苹果官方文档。&br&相信我,在这个过程中你不仅会提高英语水平,也会拓展你的视野和思路。&br&&br&&br&&b&2.第1点里面说的都是英语,接下来说说编程语言和iOS开发的学习。&/b&&br&&br&之所以要强调第1点,是因为国内实在没有什么好的教程,特别是针对12岁这个年龄阶段的初学者来说。&br&我一向很讨厌国内的计算机课教学和国内一些公司的面试。一上来就是C语言,一上来就是复杂的语法,数据结构和算法,先把你吓个半死,从此彻底失去了兴趣。可以说,在我朝:&br&&b&很多程序猿之所以愿意当程序猿,只是把它当做一个谋生工具而已。我们这批程序猿很多人都是这样,也很难改变了。但未来的天朝程序猿应该是真正有梦想,有创造力和想象力的人。&/b&&br&&br&所以,&b&远离一些让你瞬间对编程失去兴趣的教程,除非你要把自己当做一个励志榜样。&/b&&br&&br&step1. 如果你英语可以,我建议你可以从codecademy的基本教学开始&br&&a href=&///?target=http%3A//& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Learn to code&i class=&icon-external&&&/i&&/a&&br&&br&如果你对英语没什么兴趣,可以跳到step2&br&虽然这里面教的主要是网络开发语言,比如javascript,php,ruby,python之类的,但个人认为非常适合初学者入门。&br&为什么是这些网络开发语言而不是C语言之类的?&br&&b&1.兴趣&/b&&br&codeacademy的教程非常浅显易懂,而且很有趣味性,可以让你在不知不觉间学到很多东西。&br&&b&2.立见成效&/b&&br&学习任何一门技能(不仅包括编程语言)的主要目的是用来解决未知或未曾接触过的问题。所以在学这些语言的第一天,你就要尝试着做一些简单的网页,试着做一个自己的网站。不要被那些所谓的专家吓倒,按照我朝专家的观点,一个程序猿不学会数据结构和算法就不能做东西,纯属放屁!&br&这一点我和很多老美的观点一致,屠龙刀固然锋利,杀鸡未必比得上菜刀。你要学习的是如何解决问题,而不是去发明另一种编程语言和算法,这些大可以在你成为高手之后再去做。&br&永远记得,入门和成为高手是不同的过程,绝大多数人都倒在门槛上,不敢迈出第一步。&br&&br&可以参考这篇文章:&br&&a href=&///?target=http%3A///l.php%3Fl%3Df52e99a& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如何学编程,JUST DO IT!&i class=&icon-external&&&/i&&/a&&br&&br&在学完codeacademy系列中的每种语言(&b&做了一个你自己的网站或小应用&/b&)后,你就可以真正开始iOS的学习了。&br&&br&&b&我希望你到此为止仍然对编程有非常浓厚的兴趣和创造自己产品的渴望。&/b&&br&&br&step2. 接下来你就可以看&a href=&///?target=http%3A//& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&里面的iOS入门系列教程了。&br&&br&&a href=&///?target=http%3A///tutorials& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iPhone Tutorials&i class=&icon-external&&&/i&&/a&&br&里面有iOS for high school students系列教程,虽然你可能不是高中生,但考虑到我朝初等教育的先进,应该远远超过了他们的水平。&br&&a href=&///?target=http%3A///5600/ios-for-high-school-students-getting-started& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS For High School Students: Getting Started&i class=&icon-external&&&/i&&/a&&br&&br&另外我根据这里面的教程改写了一个中文版的教程(让不懂编程的人爱上iPhone开发)&br&&a href=&///?target=http%3A//.cn/s/blog_4b55fjv.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&让不懂编程的人爱上iPhone开发(系列1完结)&i class=&icon-external&&&/i&&/a&&br&&br&step3. 学完了这个系列后,就可以考虑做自己的iOS产品了。&br&&br&如果你想开发简单的应用,可以接下来看这个网站的应用开发系列&br&&a href=&///?target=http%3A///1797/how-to-create-a-simple-iphone-app-tutorial-part-1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How To Create A Simple iPhone App on iOS 5 Tutorial: Part 1/3&i class=&icon-external&&&/i&&/a&&br&&br&如果对游戏开发感兴趣,可以接下来看这个网站的游戏开发基础系列&br&&a href=&///?target=http%3A///25736/how-to-make-a-simple-iphone-game-with-cocos2d-2-x-tutorial& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&How To Make A Simple iPhone Game with Cocos2D 2.X Tutorial&i class=&icon-external&&&/i&&/a&&br&&br&使用cocos2d(cocos2d-iphone,cocos2d-x或cocos2d-html5),可以比较轻松的开发手机或者平板电脑上的游戏。&br&我个人跟人合写了一本&cocos2d权威指南&的书,不过自觉里面写的有些啰嗦了,也不一定适合你。&b&说明一下,这本书需要对Objective-C和iOS开发有一定的了解,完全的入门新手不建议购买。&/b&&br&(&a href=&///?target=http%3A///product.aspx%3Fproduct_id%3D& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&《Cocos2D权威指南(Coco2D领域内容最全面、系统和深入著作,系统讲解其使用方法、技术要点、工作原理、开发技巧、最佳实践及性能优化)》王寒,屈光辉,周雪彬&i class=&icon-external&&&/i&&/a&) &br&&br&哦,我差点忘了告诉你,raywenderlich这个网站的教程都有中文版的,你是不是松了一口气呢~&br&&br&step4. 接下来怎么办?&br&&br&接下来要回到1里面告诉你的方法,想一个idea,然后把它实现。在这个过程中你会遇到很多问题,你需要查看苹果官方教程,去和高手论剑,去开源项目取经甚至为这些项目做贡献。&br&我最近刚整理了下iOS开发常用的国外网站:&br&&a href=&///?target=http%3A//.cn/s/blog_4b55f.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS开发常用国外网站清单_eseedo_新浪博客&i class=&icon-external&&&/i&&/a&&br&当然,国内的cocoachina(&a href=&///?target=http%3A///bbs/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CocoaChina 开发讨论区 最热的iOS开发论坛&i class=&icon-external&&&/i&&/a&),51cto(&a href=&///?target=http%3A///iphone/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&iOS_移动开发&i class=&icon-external&&&/i&&/a&)和csdn(&a href=&///?target=http%3A//www.csdn.net& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&CSDN.NET - 全球最大中文IT社区,为IT专业技术人员提供最全面的信息传播和服务平台&i class=&icon-external&&&/i&&/a&上)也有很多的资料可以供你参考。
)&br&但始终记住:&br&&b&你学东西是为了解决问题的,不要陷到某个坑里起不来了。而且你可以创造性的用自己的方法来解决问题。&/b&&br&相信我,这个世界上本没有专家,只是忽悠多了就成了专家。&br&&br&不知道你目前在哪个城市,我目前人在成都,如果你需要学习又恰好在这里,可以周末或假期找我。我愿意免费教你学会基础的iOS开发(应用或游戏都可以),这样或许更有针对性。可以通过我的邮件或新浪微博(&a href=&///?target=http%3A///eseedo& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&http://&/span&&span class=&visible&&/eseedo&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&),微信(iseedo)联系我。&br&我很乐意和你分享一下自己学习iOS的心得体会。&br&&br&顺便说一下,我最近其实一直在考虑是否业余时间开一个类似美国少年黑客训练营性质的针对k12(小学,初中,高中)的编程周末班或者假期训练营,主要教K12游戏和网络应用开发,可以是公益性质的,也可以是带商业性质的。但因为工作原因迟迟没有行动。如果有同好可以联系我,我们一起探讨下这个问题,共同弥补中国黑客的10年差距。我相信这是一件非常有意义的事情。&br&这不是一个生意,但却是一件值得去做的事情。&br&&br&&b&对不同的人来说,或许应该根据自己的实际情况来选择不同的路。我从来不认为兴趣导向的学习方式就是适合所有人的,没有任何东西是适合所有人的。每个人都可以选择自己的路,条条大路通罗马,没有一个人的路是相同的,也没有万能的路。&/b&&br&但至少我个人的理念是,Learn programming the happy way,learning everything the creative way.&br&在快乐中学习,在创造中成长,这就是我所追求的目标。&br&&br&最后的最后,我想说,facebook的最初版本就是PHP写的。选择神马语言进行开发,真的没有你想象的那么重要。重要的是,立即行动起来,做产品。参考:&br&&a href=&/question/& class=&internal&&马克·扎克伯格是独自完成 Facebook 最初版本代码的吗?&/a&
谢邀。对于个人来说,这是我在知乎上看到的最有价值的问题。补充一下quora上面的相关问题链接:另外补充几个相关的新闻链接:
既然原文是说,Facebook 工程师说 Facebook 只招 full stack engineer,那我就来说说 Facebook engineer 都是怎样的人啦。&br&&br&我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师,所以后端的东西我就一点也不碰。Facebook 的工程师,级别越高就需要保持越大的影响力。如何创造更大的影响力,就是寻找当前杠杆效应最明显的问题来解决。有些问题你解决了的话,投入进去的时间每小时能换回来一千美元;有些问题你解决了的话,投入进去的时间每小时能换回来一百万美元。然而哪些问题更值得解决,这是动态的,往往还存在衰减效应。如果现在性能瓶颈在后端,你做了一个季度两个季度优化后,瓶颈就已经不在后端了,你再优化下去衰减效应就会越来越明显。等瓶颈变成前端了,你是不是就说因为你不懂,所以不愿意碰?那就相当于寄望于公司有个前端很懂性能优化的人来解决,但如果公司没有这样的人那就没有人来解决了。&br&&br&Facebook 的众多海报当中,有一张写的是「任何一个 Facebook 的问题,都不是别人的问题」。有问题,你就需要去评估是否值得解决。如果值得解决,你就应该着手去解决,而不是假设公司内会有另外一个人比你更合适解决这个问题。这时候很可能你就需要去做你从来没有做过的事情,需要学习你原本可能完全不懂的技术。如果你是个专门做数学模型的博士,加入 Facebook 原本是打算做搜索结果优化的,结果发现这不是最急需解决的问题,JavaScript 性能才是最需要解决的问题,你怎么办?如果你以为 Facebook 需要的是你做数学模型的经验,那你就错了。Facebook 需要的是你完成博士学位的学习能力。你从来没做过 JavaScript 并且觉得 JavaScript 很恶心?正确的做法是立即在网上买几本 JavaScript 入门的书连夜看完,然后着手分析性能瓶颈并且解决。在你完成手动优化后,你还可以思考一下能否把这做成自动化,例如说在代码提交时分析 JavaScript 语法树并且指出可能成为性能瓶颈的地方,又或者说从用户浏览器那里收集性能数据扔到 Hive 然后再从中分析产生瓶颈的特征。这些都可能涉及到一些你没有做过也没有学过的东西,但问题摆在那里你就需要去解决,而无论这要求你去钻研什么。这就是我所说的学习能力。&br&&br&这是高级工程师和初级工程师的主要差距。尽管在高级到初级这一维度上,美国工程师和中国工程师是有重叠的,但美国的教育体系和行业传统使得美国应届生比一般中国工程师更偏向于高级那一端。美国学生的优势在于,他们的教育体系让他们习惯面对开放性问题。一家公司万千问题当中,此时此刻哪一个最值得解决?这不是中国工程师擅长的问题,因为实在是太开放了。中国教育让人擅长在给定条件下解决问题,太开放反而不知道从何入手。此外因为绝大多数文献都是英文的,所以要钻研什么对于能读懂英文的人来说都可以非常成体系的学习,这对于很多拒绝阅读英文的中国工程师来说很不利。拒绝阅读英文意味着永远只能接受别人的二手资料,对于很多概念的理解只能停留在技师的层面,而无法上升到工程师或者科学家的层面。
既然原文是说,Facebook 工程师说 Facebook 只招 full stack engineer,那我就来说说 Facebook engineer 都是怎样的人啦。我觉得任何一方面的具体经验都不重要,重要的是思维方式和学习能力。首先说思维方式,那就是不为自己设限,不会想着自己是前端工程师…
Java是一门优秀的语言,但是有三个软件是用JVM平台的语言写的说明不了Java或者JVM如何。&br&&br&现任Apache软件基金会主席Doug Cutting开发了三个很牛逼的开源,Lucene、Nutch和Hadoop,都是用Java写的,这说明了什么,只能说明&b&Doug本人非常熟悉Java&/b&。当然,Doug是业余时间读论文然后照着论文实现的这些东西,还说明了Doug具有很强的学习能力和专研精神。
Java是一门优秀的语言,但是有三个软件是用JVM平台的语言写的说明不了Java或者JVM如何。现任Apache软件基金会主席Doug Cutting开发了三个很牛逼的开源,Lucene、Nutch和Hadoop,都是用Java写的,这说明了什么,只能说明Doug本人非常熟悉Java。当然,Doug是…
弊端是,没有人还记得面向对象原本要解决的问题是什么。&br&&br&1、面向对象原本要解决什么(或者说有什么优良特性)&br&似乎很简单,但实际又很不简单:面向对象三要素&b&封装、继承、多态&/b&&br&&br&(&b&警告&/b&:事实上,从业界如此总结出这面向对象三要素的一刹那开始,就已经开始犯错了!)。&br&&br&&b&封装&/b&:封装的意义,在于明确标识出允许外部使用的所有成员函数和数据项,或者叫&b&接口&/b&。&br&&br&有了封装,就可以明确区分&b&内外&/b&,使得类实现者可以修改封装&b&内&/b&的东西而不影响&b&外&/b&部调用者;而外部调用者也可以知道自己不可以碰哪里。这就提供一个良好的合作基础——或者说,只要&b&接口&/b&这个基础约定不变,则代码改变不足为虑。&br&&br&&br&&br&&b&继承+多态&/b&:继承和多态必须一起说。一旦割裂,就说明理解上已经误入歧途了。&br&&br&先说&b&继承&/b&:继承同时具有两种含义:其一是继承基类的方法,并做出自己的扩展——号称解决了代码重用问题;其二是&b&声明&/b&某个子类&b&兼容&/b&于某基类(或者说,接口上完全&b&兼容&/b&于基类),外部调用者可无需关注其差别(内部机制会自动把请求派发[dispatch]到合适的逻辑)。&br&&br&再说&b&多态&/b&:基于对象所属类的不同,外部对同一个方法的调用,实际执行的逻辑不同。&br&&br&很显然,多态实际上是&b&依附于继承的第二种含义&/b&的。让它与封装、继承这两个概念并列,是&b&不符合逻辑&/b&的。不假思索的就把它们当作可并列概念使用的人,显然是从一开始就被误导了。&br&&br&&br&实践中,继承的第一种含义(实现继承)意义并不很大,甚至常常是有害的。因为它使得子类与基类出现强耦合。&br&&br&继承的第二种含义非常重要。它又叫“接口继承”。&br&&b&接口继承&/b&实质上是要求“做出一个良好的抽象,这个抽象规定了一个兼容接口,使得外部调用者无需关心具体细节,可一视同仁的处理实现了特定接口的所有对象”——这在程序设计上,叫做&b&归一化&/b&。&br&&br&&br&&b&归一化&/b&使得外部使用者可以不加区分的处理所有接口兼容的对象集合——就好象linux的泛文件概念一样,所有东西都可以当文件处理,不必关心它是内存、磁盘、网络还是屏幕(当然,如果你需要,当然也可以区分出“字符设备”和“块设备”,然后做出针对性的设计:细致到什么程度,视需求而定)。&br&&br&&b&归一化&/b&的实例:&br&a、一切对象都可以序列化/toString&br&b、一切UI对象都是个window,都可以响应窗口事件。&br&&br&——必须注意,是一切(符合xx条件的)对象皆可以做什么,而不是“一切皆对象”。后者毫无意义。&br&&br&&br&显然,&b&归一化&/b&可以大大简化使用者的处理逻辑:这和带兵打仗是类似的,班长需要知道每个战士的姓名/性格/特长,否则就不知道该派谁去对付对面山坡上的狙击手;而连长呢,只需知道自己手下哪个班/排擅长什么就行了,然后安排他们各自去守一段战线;到了师长/军长那里,他更关注战场形势的转变及预期……没有这种层层简化、而是必须直接指挥到每个人的话,累死军长都没法指挥哪怕只是一场形势明朗的冲突——光一个个打完电话就能把他累成哑巴。&br&&br&&br&软件设计同样。比如说,消息循环在派发消息时,只需知道所有UI对象都是个window,都可以响应窗口消息就足够了;它没必要知道每个UI对象究竟是什么——该对象自己知道收到消息该怎么做。&br&&br&合理划分功能层级、适时砍掉不必要的繁杂信息,一层层向上提供简洁却又完备的信息/接口,高层模块才不会被累死——KISS是最难也是最优的软件设计方法,没有之一。&br&&br&&br&&br&&b&总结&/b&:面向对象的好处实际就这么两点。&br&一是通过封装明确定义了何谓接口、何谓接口内部实现、何谓接口的外部调用者,使得大家各司其职,不得越界;&br&二是通过继承+多态这种内置机制,在语言的层面支持&b&归一化&/b&的设计,并使得内行可以从代码本身看到这个设计——但,注意仅仅只是&b&支持&/b&归一化的设计。不懂如何做出这种设计的外行仍然不可能从瞎胡闹的设计中得到任何好处。&br&&br&&br&显然,不用面向对象语言、不用class,一样可以做归一化的设计(如老掉牙的泛文件概念、游戏行业的一切皆精灵),一样可以封装(通过定义模块和接口),只是用面向对象语言可以直接用语言元素显式声明这些而已;&br&而用了面向对象语言,满篇都是class,并不等于就有了归一化的设计。甚至,因为被这些花哨的东西迷惑,反而更加不知道什么才是设计。&br&&br&&br&2、人们以为面向对象是什么、以及因此制造出的悲剧以及闹剧&br&&br&误解一、&b&面向对象语言支持用语言元素直接声明封装性和接口兼容性,所以用面向对象语言写出来的东西一定更清晰、易懂&/b&。&br&&br&事实上,既然class意味着声明了封装、继承意味着声明了接口兼容,那么错误的类设计显然就是错误的声明、盲目定义的类就是无意义的喋喋不休。而&b&错误的声明比没有声明更糟;通篇毫无意义的喋喋不休还不如错误的声明&/b&。&br&&br&除非你真正做出了漂亮的设计,然后用面向对象的语法把这个设计声明出来——仅仅声明真正有设计、真正需要人们注意的地方,而不是到处瞎叫唤——否则不可能得到任何好处。&br&&br&&b&一切皆对象实质上是在鼓励堆砌毫无意义的喋喋不休&/b&。大部分人——注意,不是个别人——甚至被这种无意义的喋喋不休搞出了神经质,以至于非要在喋喋不休中找出意义:没错,我说的就是设计模式驱动编程,以及&a href=&///?target=http%3A///articles/8745.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如此理解面向对象编程&i class=&icon-external&&&/i&&/a&。&br&&br&&br&&br&误解二、&b&面向对象三要素是封装、继承、多态,所以只要是面向对象语言写的程序,就一定“继承”了语言的这三个优良特性&/b&。&br&&br&事实上,如前所述,封装、继承、多态只是语言层面对良好设计的支持,并不能导向良好的设计。&br&如果你的设计做不出真正的封装性、不懂得何谓归一化,那它用什么写出来都是垃圾。&br&&br&&br&&br&误解三、&b&把软件写成面向对象的至少是无害的&/b&。&br&&br&要了解事实上是什么,需要先科普几个概念。&br&&br&什么是真正的&b&封装&/b&?&br&&br&——回答我,封装是不是等于“把不想让别人看到、以后可能修改的东西用private隐藏起来”?&br&&br&显然&b&不是&/b&。&br&如果功能得不到满足、或者未曾预料到真正发生的需求变更,那么你怎么把一个成员变量/函数放到private里面的,将来就必须怎么把它挪出来。&br&&br&你越瞎搞,越去搞某些华而不实的“灵活性”——比如某种设计模式——真正的需求来临时,你要动的地方就越多。&br&&br&&b&真正的封装是,经过深入的思考,做出良好的抽象,给出“完整且最小”的接口,并使得内部细节可以对外透明(注意:对外透明&/b&的意思是&b&,&/b&外部调用者可以顺利的得到自己想要的任何功能,&b&完全意识不到内部细节的存在;&/b&而不是外部调用者为了完成某个功能、却被碍手碍脚的private声明弄得火冒三丈;最终只能通过怪异、复杂甚至奇葩的机制,才能更改他必须关注的细节——而且这种访问往往被实现的如此复杂,以至于稍不注意就会酿成大祸)。&br&&br&一个设计,只有达到了这个高度,才能真正做到所谓的“封装性”,才能真正杜绝对内部细节的访问。&br&&br&否则,生硬放进private里面的东西,最后还得生硬的被拖出来——当然,这种东西经常会被美化成“访问函数”之类渣渣(不是说访问函数是渣渣,而是说因为设计不良、不得不以访问函数之类玩意儿在封装上到处挖洞洞这种行为是渣渣)。&br&&br&&br&&br&一个典型的例子,就是C++的new和过于灵活的内存使用方式之间的耦合。&br&这个耦合就导致了new[]/delete[]、placement new/placement delete之类怪异的东西:这些东西必须成对使用,怎么分配就必须怎么释放,任何错误搭配都可能导致程序崩溃——这是为了兼容C、以及得到更高执行效率的无奈之举;但,它更是“抽象层次过于复杂,以至于无法做出真正透明的设计”的典型案例:只能说,c++设计者是真正的大师,如此复杂的东西在他手里,才仅仅付出了如此之小的代价。&br&&br&(更准确点说,是new/delete和c++的其它语言元素之间是非正交的;于是当同时使用这些语言元素时,就不可避免的出现了彼此扯淡的现象。即new/delete这个操作对其它语言元素非透明:在c++的设计里,是通过把new/delete分成两层,一是内存分配、二是在分配的内存上初始化,然后暴露这个分层细节,从而在最大程度上实现了封装——但比之其它真正能彼此透明的语言元素间的关系,new/delete显然过于复杂了)&br&&br&这个案例,可以非常直观的说明“设计出真正对外透明的封装”究竟会有多难。&br&&br&&br&&br&&br&&br&&b&接口继承&/b&真正的好处是什么?是用了继承就显得比较高大上吗?&br&&br&显然不是。&br&&br&接口继承没有任何好处。它只是声明某些对象在某些场景下,可以用归一化的方式处理而已。&br&&br&换句话说,如果不存在“需要不加区分的处理类似的一系列对象”的场合,那么继承不过是在装X罢了。&br&&br&&br&&br&封装可(通过固定接口而)应付需求变更、归一化可简化(类的使用者的)设计:以上,就是面向对象最最基本的好处。&br&——其它一切,都不过是在这两个基础上的衍生而已。&br&&br&&br&换言之,如果得不到这两个基本好处,那么也就没有任何衍生好处——应付需求变更/简化设计并不是打打嘴炮就能做到的。&br&&br&&br&了解了如上两点,那么,很显然:&br&1、如果你没有做出好的抽象、甚至完全不知道需要做好的抽象就忙着去“封装”,那么你只是在“封”和“装”而已。&br&这种“封”和“装”的行为只会制造累赘和虚假的承诺;这些累赘以及必然会变卦的承诺,必然会为未来的维护带来更多的麻烦,甚至拖垮整个项目。&br&&br&正是这种累赘和虚假的承诺的拖累,而不是所谓的为了应付“需求改变”所必需的“灵活性”,才是大多数面向对象项目代码量暴增的元凶。&br&&br&2、没有真正的抓到一类事物(&b&在当前应用场景下&/b&)的根本,就去设计继承结构,是必不会有所得的。&br&&br&不仅如此,请注意我强调了&b&在当前应用场景下&/b&。&br&这是因为,分类是一个极其主观的东西,&b&不存在普适的分类法&/b&。&br&&br&举例来说,我要研究种族歧视,那么必然以肤色分类;换到法医学,那就按死因分类;生物学呢,则搞门科目属种……&br&&br&想象下,需求是“时尚女装”,你却按“窒息死亡/溺水死亡/中毒死亡之体征”来了个分类……你说后面这软件还能写吗?&br&&br&&br&&br&类似的,我遇到过写游戏的却去纠结“武器装备该不该从游戏角色继承”的神人。你觉得呢?&br&&br&事实上,游戏界真正的抽象方法之一是:一切都是个有位置能感受时间流逝的精灵;而某个“感受到时间流逝显示不同图片的对象”,其实就是游戏主角;而“当收到碰撞事件时,改变主角下一轮显示的图片组的”,就是游戏逻辑。&br&&br&&br&看看它和“武器装备该不该从游戏角色继承”能差多远。想想到得后来,以游戏角色为基类的方案会变成什么样子?为什么会这样?&br&&br&&br&&br&&br&&br&最具重量级的炸弹则是:正方形是不是一个矩形?它该不该从矩形继承?如果可以从矩形继承,那么什么是正方形的长和宽?在这个设计里,如果我修改了正方形的长,那么这个正方形类还能不能叫正方形?它不应该自然转换成长方形吗?如果我有两个List,一个存长方形,一个存正方形,自动转换后的对象能否自动迁移到合适的list?什么语言能提供这种机制?如果不能,“一视同仁的处理某个容器中的所有元素”岂不变成了一句屁话?&br&&br&造成这颗炸弹的根本原因是,面向对象中的“类”,和我们日常语言乃至数学语言中的“类”根本就不是一码事。&br&&br&面向对象中的“类”,意思是“接口上兼容的一系列对象”,关注的只不过是接口的兼容性而已(可搜索 里氏代换);关键放在“可一视同仁的处理”上(学术上叫is-a)。&br&&br&显然,这个定义完全是且只是为了应付归一化的需要。&br&&br&这个定义经常和我们日常对话中提到的类概念上重合;但,如前所述,根本上却彻彻底底是八杆子打不着的两码事。&br&&br&就着生活经验滥用“类”这个术语,甚至依靠这种粗浅认识去做设计,必然会导致出现各种各样的偏差。这种设计实质上就是在胡说八道。&br&就着这种胡说八道来写程序——有人觉得这种人能有好结果吗?&br&&br&——但,几乎所有的面向对象语言、差不多所有的面向对象方法论,却就是在鼓励大家都这么做,完全没有意识到它们的理论基础有多么的不牢靠。&br&——如此作死,焉能不死?!&br&&br&&br&——你还敢说面向对象无害吗?&br&&br&——在真正明白何谓封装、何谓归一化之前,每一次写下class,就在错误的道路上又多走了一步。&br&——设计真正需要关注的核心其实很简单,就是封装和归一化。&b&一个项目开始的时候,“class”写的越早,就离这个核心越远&/b&。&br&——过去鼓吹的各种面向对象方法论、甚至某些语言本身,恰恰正是在怂恿甚至逼迫开发者尽可能早、尽可能多的写class。&br&&br&&br&&br&误解四、只有面向对象语言写的程序才是面向对象的。&br&&br&事实上,unix系统提出泛文件概念时,面向对象语言根本就不存在;游戏界的精灵这个基础抽象,最初是用C甚至汇编写的;……。&br&&br&面向对象其实是汲取以上各种成功设计的经验才提出来的。&br&&br&所以,面向对象的设计,不必非要c++/java之类支持面向对象的语言才能实现;它们不过是在你做出了面向对象的设计之后,能让你写得更惬意一些罢了——但,如果一个项目无需或无法做出面向对象的设计,某些面向对象语言反而会让你很难受。&br&&br&&b&用面向对象语言写程序,和一个程序的设计是面向对象的,两者是八杆子打不着的两码事&/b&。纯C写的linux kernel事实上比c++/java之类语言搞出来的大多数项目更加面向对象——只是绝大部分人都自以为自己到处瞎写class的面条代码才是面向对象的正统、而死脑筋的linus搞的泛文件抽象不过是过程式思维搞出来的老古董。&br&&br&——这个误解之深,甚至达到连wiki词条里面,都把OOP定义为“用支持面向对象的语言写程序”的程度。&br&——恐怕这也是没有人说泛文件设计思想是个骗局、而面向对象却被业界大牛们严厉抨击的根本原因了:真正的封装、归一化精髓被抛弃,浮于表面的、喋喋不休的class/设计模式却成了”正统“!&br&&br&借用楼下PeytonCai朋友的链接:&br&&a href=&///?target=http%3A///405/.shtml& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&名家吐槽:面向对象编程从骨子里就有问题&i class=&icon-external&&&/i&&/a&&br&&br&————————————————————————————&br&&br&总结: 面向对象其实是对过去成功的设计经验的总结。但那些成功的设计,不是因为用了封装/归一化而成功,而是&b&切合自己面对的问题,给出了恰到好处的设计&/b&。&br&&br&让一个初学者知道自己应该向封装/归一化这个方向前进,是好的;用一个面向对象的条条框框把他们框在里面、甚至使得他们以为写下class是完全无需思索的、真正应该追求的是设计模式,则是罪恶的。&br&&br&事实上,class写的越随意,才越需要设计模式;就着错误的实现写得越多、特性用得越多,它就越发的死板,以至于必须更加多得多的特性、模式、甚至语法hack,才能勉强完成需求。&br&&br&只有经过真正的深思熟虑,才有可能做到KISS。&br&&br&&br&到处鼓噪的面向对象编程的最大弊端,是把软件设计工作偷换概念,变成了“就着class及相关教条瞎胡闹,不管有没有好处先插一杠子”,甚至使得人们忘记去关注“抽象是否真正简化了面对的问题”。&br&&br&&b&一言以蔽之:没有银弹。&/b&任何寄希望于靠着某种“高大上”的技术——无论是面向对象、数据驱动、消息驱动还是lambda、协程等等等等——就能一劳永逸的使得任何现实问题“迎刃而解”的企图都是注定要失败的,都不过是外行的意淫而已;靠意淫来做设计,不掉沟里才怪。&br&&br&想要做出KISS的方案,就必须对面对的问题有透彻的了解,有足够的经验和能力,并经过深思熟虑,这才能做出简洁的抽象:至于最终的抽象是面向对象的、面向过程的还是数据驱动/消息驱动的,甚至是大杂烩的,都是可能的。只要这个设计能做到最重要、也是最难的KISS,那它就是个好设计。&br&&br&的确有成功的经验、正确/合理的方向:技术无罪,但,没有银弹。&br&&br&&br&————————————————————————————————————————&br&:&br&&br&嗯,这个是我很久很久以前在CU上发过的一系列帖子……&br&&br&当时很多鼓吹“面向对象就是好来就是好的”就着一知半解胡搅蛮缠,这系列帖子是驳斥他们的。所以很多词句挖苦意味很浓,见谅。&br&&br&&blockquote&再比如,传说中的面向对象本该大显神威的游戏领域——就说流行的WOW吧。&br&&br&这个游戏有10个职业,10个种族,每个种族都有自己的几个特有种族天赋(这个种族天赋还可能根据职业有所不同,比如血精灵);每个职业有几十甚至上百种不同的技能/法术,这些技能有近战技能,有远程技能;有的技能会对敌方造成伤害或不良状态,有的技能能给己方队友加上好的状态或治疗队友;而且很多这类技能还会根据目标的状态切换不同的效果;有些技能是单体效果,有些技能是光环效果(又分为对地方造成光环效果还是对己方两种,也可能两者兼备),而另一些技能是地图范围效果(如烈焰风暴是一个圆形区域;冰锥术是一个锥形区域;特别的,顺劈斩是在当前攻击目标旁边不超过5码的另一个敌对目标——某个boss的顺劈斩更强,它会从第一个目标传递几十个目标,总传递距离可以达到夸张的几百码;并且这个伤害也是各有特色的:战士的顺劈斩是每个目标伤害固定,有些boss的则是同时挨打的人越多伤害越低,但还有个变态boss却是被打的人越多伤害越高……);大多数技能还可以通过天赋雕文强化/改变的面目全非(比如插一个雕文,法师的火球就不会造成持续伤害但施法速度增加;点一个天赋,法师的冰冷减速效果就会降低对方受到的治疗效果;点某个天赋,盗贼的某些技能攻击就会延长自身提升攻击速度这个状态的持续时间,等等);还有很多技能是因为学习了某个专业或装备/持有某个物品而得到(比如,学了采药,就可以得到生命之血这个技能,每3分钟可用,能够在若干秒内回复你若干生命值——这个技能和采药技能等级挂钩,但很可能接下来的某个版本,就会再和玩家的生命上限值挂钩,以避免它像现在一样,被玩家斥为废柴技能);另外,不同等级的技能可能有施法时间甚至额外特效方面的差别;此外,每个技能会造成不同属性的伤害/效果(神圣、暗影、元素、物理等等),甚至一个技能同时造成多种类型伤害效果,更有冰火球这样根据目标抵抗力而智能选择更大杀伤效果类型的变态魔法……&br&&br&最后,最最重要的是,这所有职业上千个技能(或许加上NPC特有的一些技能,数目会达到几千种)并不稳定,常常会因为某个技能或某些技能的组合过于强大/弱小而加以修改(比如加一个额外的负面状态如无敌/圣疗;甚至全面修改“抗性”“破甲”概念的定义)——玩过wow的都知道,这事几乎每个月都有发生。&br&&br&好吧,你打算怎么设计这数千个技能/效果?&br&或者,你就这样把这些概念用class这个筐一装,然后到处开特例、特例都解决不了就搞23个模式使劲往一块粘,管他整体结构如何,淌哪算哪?&br&&br&扯淡。&br&&br&&br&有个故事说的好:&br&有人送几个瞎子一条鱼,瞎子们高兴坏了,决定熬鱼汤喝。鱼汤熬好了,瞎子甲尝了一口,真鲜啊;瞎子乙赶紧也喝一口,太鲜了,太好喝了。几个瞎子一边喝一边赞美——忽然瞎子丙叫了起来:鱼跳我脚上了,它不在锅里!&br&众瞎子大惊:这鱼都没放到锅里,汤就鲜成这样了;要是放进锅里,还不得把我们都鲜死啊!&br&&br&众面向对象原教旨主义者把事情搅得一团糟,同样也会大惊:天哪,用了面向对象都复杂成这样,这要不用面向对象,这软件就不能写了吧!&/blockquote&&br&&br&&blockquote&想想看,假如让那些面向对象原教旨主义者来设计,会出现什么情况:&br&&br&定义一个基类叫技能;然后一个继承类叫法术技能,另一个叫物理技能;然后神圣法术从法术技能继承,疾病法术也从法术技能继承;由于圣骑士一个技能同时具备物理和法术两种效果,于是必须多重继承神圣法术和物理技能;多重继承太危险,于是不得不把神圣法术搞成接口类,引入接口继承甚至带实现的纯虚函数等等高端概念;然后,活该枪毙的暴雪设计师又想出了让某个技能同时对目标加上神圣持续伤害效果的奇怪点子——于是不得不再加个继承层次,使得神圣法术是神圣持续伤害法术的子集:仅立刻造成一次持续伤害的DOT(damage of time)技能……&br&&br&那么,点一个天赋,一个技能就会有dot,否则就没有怎么办?&br&&br&设计模式是灵丹妙药,不是吗 ^_^&br&&br&&br&等到把这所有几千个技能全部搞定,起码也是一个数万个类、几十层的恐怖继承树,并且会用完23个设计模式(甚至再发明几个新模式出来,我也不会感到奇怪),精巧复杂到没有任何人愿意去碰它。&br&&br&&br&但,请注意,天杀的暴雪设计师,在最开始的设计方案里规定DOT不能暴击;后来又添加约定说某某某职业的某个dot可以暴击;另一个职业的某个dot在点天赋后可暴击;至于死亡骑士,在他穿了T9套装中的其中四件装备时,他的某个瘟疫类型的dot可以暴击——但另一个瘟疫dot永远不能暴击。&br&&br&&br&嗯嗯嗯,太好解决了——这不就是策略模式吗?&br&&br&好吧,你再填几十几百个类体系,然后把旧的几十层继承树中的数万个类一个个都策略化吧。反正不是我在维护……&br&&br&&br&&br&哎呀不好,那个枪毙了几百次都还没死的暴雪设计师又出馊主意了,他要求:当死亡骑士点了邪恶系的某个天赋时,不光给他增加一个新的dot、并且在这个新dot的存在期间,还要保护他的两个dot性疾病和1个debuf性疾病不被驱散!&br&&br&&br&继续补充:在WLK里面,那个脑袋都被子弹打成筛子了的暴雪设计师又跳出来了,用他满是漏洞的脑子出了个该杀的主意:他要求添加载具概念,当玩家坐上载具时,临时删除他的所有技能,替换为载具的技能;或者当他坐在特定载具的特定位置时,防止他受到任何伤害、并且允许他释放自己的所有技能!&br&更该死的是,他要求,一些技能本来不允许在移动中施放;但现在,当玩家坐在载具上某个位置时,要临时允许他移动施法!&br&&br&还有,为了平衡某个野外战场,他还要求,在某方人数较少时,临时根据提高他们的生命值和所有技能的攻击力和治疗能力——这个改变必须根据进入战场的人数实时进行;在一方连续在某个战场失败时,同样要给他们一定补偿!&br&&br&&br&&br&嗯嗯,看看这些不断改变的刁钻需求吧,如果没有面向对象,没有以策略模式为首的28个设计模式(我有理由相信你们需要至少28个设计模式而不是23个)的英明领导,我们这些没接触过大项目、不懂面向对象的傻B们,就是哭的拿眼泪把长城溶解掉都没办法吧?——我当然知道搭建长城的材料极难溶与水。&br&&br&可怜的瞎子,你们的鱼汤很鲜吧?&/blockquote&&br&&br&&br&&br&嗯,到这里,希望读者们也能停下来,好好思考一下,看看这个问题该如何解决。&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&&br&想到了没有?&br&这里是答案,看看你的想法是否能不谋而合吧:&br&&br&&blockquote&这个问题暴雪在Diablo 2时代已经完美解决了: 法术/技能数据库化&br&&br&&br&所谓数据库化,其实等同于表格化,例如这个随便杜撰出来的简化方案,是设计一个有如下字段的数据表格:&br&&br&法术ID 动画效果 作用范围 作用类型 属性 特殊限制 强化类型 特殊设定&br&&br&&br&其中,特殊设定字段可以是一段LUA代码,可以在其中搜索、设置极其特殊的伤害类型,或者查询顺劈斩/治疗链等奇特技能的传递目标等等。&br&&br&特殊限制字段设定法术的施法或/和生效条件,如驱散限定为只能作用于魔法性buf/debuf(根据职业不同,可能有进攻性驱散和防守性驱散之一,也可能同时具备——这就体现在可否驱散敌方/友方目标的debuf)&br&&br&&br&&br&在这个方案下,释放一个法术/技能,就成为一种查表运算——找到此法术ID,找到它的作用类型和伤害属性,计算特殊设定(包括但不限于顺劈斩模式的判断、天赋加成和天赋效果、雕文加成和雕文效果等等)。&br&&br&于是,到最后,整个法术体系被分为一组组的魔法buf/debuf、物理buf/debuf,这些buf/debuf会影响伤害公式中的某个因子或者造成伤害效果;而伤害效果又分为立即伤害/立即治疗和持续伤害/持续治疗;最后则是一套影响范围判定机制。&br&&br&&br&举例来说,骑士开圣盾,他同时得到一个buf和一个debuf。&br&buf是“无敌”,效果相当于设置伤害公式 a*(....) 前面的a因子为0(没有无敌时此因子为1),于是所有伤害无效。&br&debuf则是“自律”,因为他的圣盾、圣疗技能判断条件里都有“有自律debuf,则不允许使用”的设定,于是禁止他在短时间内再次使用这些无赖技能。&br&&br&敌方法师对他释放寒冰箭,系统受理,但查询骑士状态,发现他处于无敌状态,返回大大的两个字“免疫”。&br&&br&然后,有一个敌方牧师对他使用驱散,查询牧师的驱散术发现,在驱散术的可驱散列表里没有圣盾术,于是提示无法驱散或驱散了另外的可驱散(魔法)效果。&br&敌方牧师迅速反应过来,再次对他使用强力驱散;查询牧师强力驱散术,发现该牧师在不久前使用过强力驱散,提示无法施法。&br&等待3秒后,敌方牧师发现自己的强力驱散冷却(cool down),再次使用强力驱散,查询发现强力驱散可驱散圣盾术,于是成功移除骑士的无敌状态。&br&&br&现在,敌方法师再次对他释放寒冰箭,骑士切换冰抗光环,系统查询骑士状态,发现冰抗光环,又查询法师穿透等级,和暴击等级,根据公式计算能否命中、能否造成全额伤害以及能否暴击;然后提取法师和骑士双方装备、天赋数据代入公式计算伤害加成、减免数据,最后给出骑士受到的伤害数字(包括部分抵抗了多少)。&br&&br&&br&&br&在暴雪设计师的整理之下,如上种种最终构成了几个表格;只要查询并代入相应的数据,即可计算出伤害/治疗数值以及类型;特殊效果可以用存储在数据库中的LUA代码补充完成。&br&&br&最终的设计效果就好像内嵌了一个解释器,这个解释器会根据法术ID解释执行数据库内部的相关内容。&br&&br&&br&这样一来,只要伤害公式、动画效果等等就位,那么新增一个法术就只不过是在数据库中新增一条记录;让某个角色学会一个新法术,则只需在它的可使用法术列表里添加法术名称(或法术ID);释放法术是根据法术ID在数据库中提取动画;计算伤害是根据法术ID读取伤害公式,然后代入相关字段并求值。&br&&br&而这一切,甚至可以通过内部实现的编辑器,用图形界面完成。&br&&br&&br&如何?无与伦比的扩展性和便利性,是吧?&/blockquote&&br&&br&这么一整套东西,核心代码很可能只有数千甚至数百行。这是因为看似复杂的光环、buf等等东西,其实都已经抽象到和其他法术同样的流程上来了。最终,所有这些全部归一为解释执行伤害公式、提取执行指定动画之类寥寥几个通用过程。&br&&br&我并没有亲自实现过这个,所以不敢断定这玩意儿靠几百行代码真的就能全部实现;但根据我在其它项目上的经验,这套东西应该就是数百行代码就可以写出来的——但写出并调试好这数百行代码所需的时间可能是一个星期甚至一个月。&br&&br&相比于不假思索的写下class所必然导致的庞大、复杂的类层次,以及扯来扯去蛋疼无比的复杂的设计模式大网,这玩意儿的实现、维护、修改、扩展的便利程度,显然不是一个量级的:前者可能数百人努力数年、弄成几百万行代码都不能正确实现需求,而且必然bug满天飞;而后者,一个人,个把月,千把行代码,完成。如果实现水平足够的话,写完再不用碰代码,扩展、维护都不过是用自己实现的工具拖来拖去,然后点存盘写入数据库,完事。&br&&br&&br&所以说,万不可傻抱着面向对象不放。你所面对的问题才是最重要的。&br&你必须随机应变给出合适的方案——至于最后的设计方案会是什么流派,那玩意儿根本无关紧要。简单、有效、可靠,比什么都重要。&br&&br&最后,还是我在前文总结的那句话:&br&&blockquote&&p&封装可(通过固定接口而)应付需求变更、归一化可简化(类的使用者的)设计:以上,就是面向对象最最基本的好处。其它一切,都不过是在这两个基础上的衍生而已。&/p&&br&&p&换言之,如果得不到这两个基本好处,那么也就没有任何衍生好处——应付需求变更/简化设计并不是打打嘴炮就能做到的。&/p&&/blockquote&&br&再强调一遍,应付需求变更/简化设计并不是空洞的宣传口号。&br&&br&那些堆砌无用的所谓“设计模式”的家伙,其实是在每个零件表面粘上挂钩——据他们说,这样会增加灵活性、应对需求变更、简化设计:比如说你带了个包,就可以挂他们在飞轮上粘的那个勾子上。&br&但实际上,你永远不会把包挂飞轮上(但你还是不得不为那些”聪明绝顶“的家伙“为了避免飞轮上的钩子脱落、挂住其它零件、离心力太大破坏挂在上面的包”等等而衍生出的”杰出“设计买单)。&br&&br&很遗憾。只有杀马特设计师才会这样做。真正合格的设计师压根不会在设计发动机时考虑“飞轮上挂包”这样的需求。他会干净利落的在整车设计时加个后备箱。&br&&br&&br&请注意,这并不是个比喻。&br&&br&如你所见,在”每个零件上粘上挂钩“这种事情实在太过疯狂,所以在其他行业连玩笑都不是,因为再傻的人都不会这么做。&br&&br&然而在软件设计时……这种事情是如此多见,多见到面向对象的领军人物会推荐别人这样做(&a href=&///?target=http%3A///articles/8745.html& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&如此理解面向对象编程&i class=&icon-external&&&/i&&/a&);多见到业内很多大佬都不得不站出来,怒斥”面向对象是个骗局“。&br&&br&&a href=&/?target=http%3A///405/.shtml& class=&internal&&名家吐槽:面向对象编程从骨子里就有问题&/a&&br&“面向对象编程是一个极其糟糕的主意,只有硅谷里的人能干出这种事情。” — Edsger Dijkstra(图灵奖获得者)&br&&br&&a href=&/?target=http%3A//en.wikipedia.org/wiki/Edsger_W._Dijkstra& class=&internal&&Edsger W. Dijkstra&/a&&br&&br&如此沉重的心智负担,这显然是面向对象的原罪。
弊端是,没有人还记得面向对象原本要解决的问题是什么。1、面向对象原本要解决什么(或者说有什么优良特性)似乎很简单,但实际又很不简单:面向对象三要素封装、继承、多态(警告:事实上,从业界如此总结出这面向对象三要素的一刹那开始,就已经开始犯错…
首先你要选择你准备采用的发布协议。例如 gpl 啊 bsd 啊 apache 啊 mit 啊等等。&br&&br&然后,你可以参考该协议中给你的建议。&br&&br&一般而言协议中会建议你在&b&每个源文件头&/b&都加上版权信息,这个信息对于每个不同的协议不同。你可以打开一个对应协议的开源项目,查看里面的代码头,一般这个头是协议的简化版。&br&&br&把每个文件都加上版权信息,然后在你的项目的主目录中存放你使用的协议的「完整全文」,这个文件一般可以取名为 COPYING ,当然你也可以取名为用户可以理解的任何名字。&br&&br&源代码仓库中包含版权协议的完整全文,并且每个源代码头都包含版权声明简化版。然后这个代码要「发布」出去(发布的方式与场所你可以任意选择)。这就满足了开源的基本要素。就开源本身来说,以某个开源的协议发布,就算作开源。&br&&br&至于其他的事情都是「可选」的,你做了更多,可以更好的宣传你的项目,但并不是强制的。
首先你要选择你准备采用的发布协议。例如 gpl 啊 bsd 啊 apache 啊 mit 啊等等。然后,你可以参考该协议中给你的建议。一般而言协议中会建议你在每个源文件头都加上版权信息,这个信息对于每个不同的协议不同。你可以打开一个对应协议的开源项目,查看里面…
这个答案适用于所有硅谷大公司,主要适用于应届生。&br&&b&第一步:交简历&/b&&br&交简历的方式有很多&br&&ol&&li&如果 Facebook 在你的大学招聘的话,在 Career Fair 上递简历。这主要适用于北美的学生。在中国,FB 没有正式招聘活动,但在一流大学(清北、上交等)通常会有通过校友、学生组织来代为传递简历&/li&&li&内推。找你熟悉的员工,把你的简历放到招聘系统中。因为如果推荐成功有奖金,一般大家会很愿意帮忙(当然你需要满足起码的条件)。内推一般不会增加录用的概率,但基本可以保证拿到 phone screen&/li&&li&官网投简历。&a href=&///?target=https%3A///careers/& class=& external& target=&_blank& rel=&nofollow noreferrer&&&span class=&invisible&&https://www.&/span&&span class=&visible&&/careers/&/span&&span class=&invisible&&&/span&&i class=&icon-external&&&/i&&/a&&/li&&li&把简历直接交给你认识的公司 recruiter&/li&&/ol&&br&&b&第一点五步:Phone Screen&/b&&br&通常为了防止耽误工程师的时间,如果你和 recruiter 未曾谋面,通常他们会安排一轮 phone screen,由recruiter进行,问一些基础问题,答案很明确(所以可以由非工程师进行)&br&&blockquote&问题举例(所有题目均来自各个不同的公司,下同)&br&&ol&&li&HTTP 使用的是什么端口&/li&&li&SSL 是什么意思,有什么用&/li&&li&在代码库中找一个函数,应该用什么命令行工具&/li&&/ol&&/blockquote&如果能确定你不会浪费公司的时间(比如你曾经和 recruiter 聊过,你有人内推并强烈推荐,等等),有些时候这个环节会省掉。&br&&br&&b&第二步:电话面试/校园面试&/b&&br&接下来你将被工程师面试,考察代码能力。如果是校园招聘,面试在学校就业中心或学校附近宾馆进行。否则通过电话进行。&br&电话面试通常是打开一个在线文本编辑器如 Google Doc。面试官提出问题,由你现场写代码。写完后通常会和面试官讨论,如 testing strategy,时间空间复杂度,改进空间,等等。&br&&blockquote&问题举例:&br&编写一个程序 deep clone 一个图(graph) &br&检查一个只含有括号的字符串括号是否正确嵌套,即[()]是合法的,())(是不合法的&/blockquote&面试的技巧是 think aloud,把你的思维过程说出来。面试考察的是解决问题的能力。你并不需要听到问题后立刻开始写(通常最好是你先要求澄清一下问题中模糊的点,并大致描述一下你的算法)。并不需要第一次就写出最优算法。先写出 &img src=&///equation?tex=O%28n%5E2%29& alt=&O(n^2)& eeimg=&1&&,之后改进成&img src=&///equation?tex=O%28n+%5Clog+n%29& alt=&O(n \log n)& eeimg=&1&&比想十分钟&img src=&///equation?tex=O%28n+%5Clog+n%29& alt=&O(n \log n)& eeimg=&1&&好很多。&br&&br&&b&第三步:On-site Interview&/b&&br&如果你通过了电话面试,你会被邀请到公司的总部面试。公司会提供机票酒店并报销你的餐费、出租车等费用,换句话说你不需要自己花一分钱。&br&面试题和电话面试类似,但有时会涉及到 architecture 类问题,比如:&br&&blockquote&问题举例:&br&我现在要写一个短网址(URL shortener)服务,这个服务的架构应该如何设计?&/blockquote&面试技巧和上面一致。&br&On-site interview 还会考察所谓 cultural fit,也即你能否很好地适应到公司的文化中。只要你性格不要太古怪一般问题不会很大。同时会带你参观公司,也给你一个了解公司双向选择的机会&br&&br&&b&第四步:发 Offer,谈条件,签 Offer,办签证&/b&&br&如果一切顺利的话你会拿到 offer。如果你有筹码(通常是对手公司offer)的话,待遇一般可以谈(放心 rescind offer 只有极端情况才会发生)。之后,签完 offer,公司雇的移民律师会帮助你申请工作签证(放心,肯定让你走成。即使美国签证实在拿不到,可以去加拿大办公室过渡半年到一年)&br&&br&&b&第五步:入职&/b&&br&Yay&br&&br&&b&第六步:出任 CEO,赢取白富美,走向人生巅峰&/b&
这个答案适用于所有硅谷大公司,主要适用于应届生。第一步:交简历交简历的方式有很多如果 Facebook 在你的大学招聘的话,在 Career Fair 上递简历。这主要适用于北美的学生。在中国,FB 没有正式招聘活动,但在一流大学(清北、上交等)通常会有通过校友、…
&b&J++是什么?&/b&&br&J++是微软的Java实现版本,表达式、关键字、语法规约都和Java一致,符合Java的语言规范,2004年1月停止支持。&br&&br&&b&Sun为什么要告微软&/b&&br&Sun一开始是授权微软可以使用Java的,随后对微软提起了商标侵权的诉讼,因为Sun的商标授权协议里要求实现必须是“兼容的”,才能使用Java的商标。而微软的MSJVM没有通过Java的符合性测试。最终Sun和微软和解,条件是J++只能开发到1.1.4版本,并且停止MSJVM的分发和下载。&br&J++的部分技术被回收利用,吸收到了.Net平台,演化成为J#,最终到现在的C#。&br&&br&&br&&b&J++与Java的不同点&/b&&br&&ul&&li&J++没有实现部分Java的特征,如RMI (Remote Method Invocation), JNI (Java Native Interface)&br&&/li&&li&J++增加了一些Java没有的特征,如callback,delegate,event,从这时起就已经算是一个不同于Java的新语言了。现在可以在C#里看到这些特征。&/li&&li&J++没有遵守Java对操作系统层调用的标准,而是采用了J/Direct框架,提供了一套完全绕过Java类库与API访问OS的机制,能直接调用Win32 API,因而有更好的性能。在现在的.Net框架中,有一套P/Invoke机制与其对应。&/li&&li&使用了MS扩展特征的J++程序不能直接运行在Java SDK上,但有项目能使这些程序跑在开源的JVM上。不过这些扩展并没有被广泛的使用。&/li&&li&J++支持ActiveX&/li&&li&J++提供了WFC(Windows Foundation Classes)框架,封装了Win 32 API以及DHTML对象模型,主要用于在Windows上开发GUI应用程序。&/li&&/ul&可以看到,J++对Java做了大量的改进,这些改进后来都吸收到了.Net平台以及C#语言当中。&br&&br&&br&&b&After Math&/b&&br&从法律和道义的角度来讲,微软违约很不厚道这点毋庸置疑,以下主要是从技术的角度来进行评价,一言以概之,时间证明Sun并没有站在先进生产力的一边。&br&最核心的槽点,可能就是J++搞私有API/不跨平台。但这直接带来了性能上的提升,虽然影响了跨平台,但作为一种工程上的trade off,不一定是坏事,想想当年的电脑有多慢吧。现在微软官方的.Net CLR实现出于性能考虑,同样把不少工作推到了平台相关的native代码层上,也并没有影响mono实现跨平台,可见这个槽点根本就不算个事。&br&J++可以认为一直延伸到了今天的.Net一系的产品线,所以要评价J++是怎样一种存在,在很大程度上需要把今天的C#/.Net和Java对比。现在Java和C#相比,除了(官方)跨平台,以及因为起步早+成本相对可以较低所以行业应用较多以外,毫无撸点,语言特征方面C#更是甩Java几条街。&br&J++增加的语法特征,不少延续到了C#上,用过都知道爽。&br&JNI和C# P/Invoke相比,易用性完全不在一个档次上。&br&Java至今还鸡肋的泛型,谁用谁蛋碎。&br&由于mono项目的存在,使得C#跨平台根本不是问题,唯一影响其广泛在开源社区被采用(如默认在Linux发行版中集成)是因为开源社区普遍不待见微软,并且对微软的CP(Community Promise,微软承诺允许开源社区自由的对包括C#在内的部分微软专利产品、规范编写自己的实现)持保留意见。但这并不影响mono的广泛使用,不少的应用程序、开发框架都采用mono作为脚本引擎,比如Unity3D引擎。&br&最近在研究把CoffeeScript编译到CLR上执行,顺便再说下运行时环境,JVM vs CLR。这么多年来,产生了一些编译到Java byte code,然后在JVM上运行的的语言,比如Scala,但并没有证据表明Sun一开始的设计就考虑到了JVM大生态圈的建立。而.Net CLR则提供了一系列相当凶残的方案,比如DLR(Dynamic Language Runtime),编译器的开发者只需要解析出代码的AST(Abstract Syntax Tree),再加上少量的glue code,就能把一种新语言target到.Net上运行,完全无需操心代码生成、代码优化、runtime等等需要花费大量精力的编译器后端环节,并且能在后续.Net升级时,自动获得新的改进(比如更加NB的代码优化算法)。这代表什么?一个开发者甚至不需要把《编译原理》一书读完,翻了前几章能写个词法分析和语法分析,会解决Grammar的Shift-Reduce conflict,就能撸出一个能用于生产的以CLR为目标平台的编译器出来。不管最后结果会如何,从技术的角度而言,微软的解决方案是更有利于开发生态的建立。 &br&从这些角度来看,J++虽然不能说是完爆Java,青出于蓝四个字还是能提的,进步的态度和力度都是值得称道的。微软在当年受制于Sun的许可协议时,尚且大胆的对Java进行扩展改进,后续衍生的C#/.Net平台的每个新版本的演化力度都不弱,反观Java这么多年来的进展,不免让人呵上一呵。&br&和微软现在C#的Community Promise相对比,当年Sun给微软的Java授权协议,不得不说实在是太狭隘了,最终在一定程度上限制了自身的发展。
J++是什么?J++是微软的Java实现版本,表达式、关键字、语法规约都和Java一致,符合Java的语言规范,2004年1月停止支持。Sun为什么要告微软Sun一开始是授权微软可以使用Java的,随后对微软提起了商标侵权的诉讼,因为Sun的商标授权协议里要求实现必须是“兼…
先上图[1]:&br&&img src=&/acf5d79d6dfaee6f870cb_b.jpg& data-rawwidth=&1413& data-rawheight=&1411& class=&origin_image zh-lightbox-thumb& width=&1413& data-original=&/acf5d79d6dfaee6f870cb_r.jpg&&&br&&&a href=&///?target=http%3A//en.wikipedia.org/wiki/PayPal_Mafia& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PayPal Mafia&i class=&icon-external&&&/i&&/a&&(PayPal 黑帮)指多位参与创立多家明星科技公司的 PayPal 创始人、前高管、员工。“PayPal 黑帮系”公司包括LinkedIn、YouTube、Tesla Motors、SpaceX、Solar City、Yelp、Palantir Technologies、Geni、Yammer、Kiva、Slide等。&br&&br&PayPal 黑帮成员主要包括:&br&&br&一、Icon 级人物:&br&&ol&&li&&b&Peter Thiel&/b&(PayPal 联合创始人、前CEO)&br&&img src=&/0b02eabeddfa_b.jpg& data-rawwidth=&247& data-rawheight=&204& class=&content_image& width=&247&&Peter Thiel 目前担任知名风投机构 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Founders_Fund& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Founders Fund&i class=&icon-external&&&/i&&/a& 的主管合伙人、对冲基金 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Clarium_Capital& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Clarium Capital&i class=&icon-external&&&/i&&/a& 总裁、Facebook 董事(Peter Thiel 曾是 Facebook 第一名外部投资人),并创立了软件公司 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Palantir_Technologies& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Palantir Technologies&i class=&icon-external&&&/i&&/a&(2013年9月时估值已达90亿美元[2])。被誉为PayPal黑帮“教父”。Peter Thiel 目前身价22亿美元[3]。&br&&br&&/li&&li&&b&Elon Musk&/b&(PayPal 联合创始人、前董事)&br&&img src=&/60fec16b5ee6_b.jpg& data-rawwidth=&338& data-rawheight=&149& class=&content_image& width=&338&&Elon Musk 创立了 Tesla Motors、Solar City、SpaceX(2014年3月估值48亿美元[2]) 等知名公司,并提出了超高速运输概念&a href=&///?target=http%3A//en.wikipedia.org/wiki/Hyperloop& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Hyperloop&i class=&icon-external&&&/i&&/a&。Elon Musk 应该是 PayPal 黑帮里目前最知名、最有号召力的企业家,目前身价84亿美元[4]。&br&&br&&/li&&li&&b&Reid Hoffman&/b&(PayPal 前执行副总裁)&br&&img src=&/d34e914b2beca_b.jpg& data-rawwidth=&270& data-rawheight=&186& class=&content_image& width=&270&&Reid Hoffman 参与创立了职业社交网站 LinkedIn,目前担任 LinkedIn 董事会主席及知名风投机构 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Greylock_Partners& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Greylock Partners&i class=&icon-external&&&/i&&/a& 合伙人。Reid Hoffman 曾介绍 Peter Thiel 参与 Facebook 的第一笔外部投资(他本人也有参与)。&br&Reid Hoffman 是硅谷最成功的天使投资人之一,投资过的公司包括了社交游戏公司 Zynga、 Last.fm 以及社交网站 Tagged等。Reid Hoffman 目前身价33亿美元[5]。&br&&/li&&/ol&&br&二、其他知名成员:&br&&ul&&li&&b&Max Levchin&/b&(创始人、前首席技术官):创立了个人分享网站&a href=&///?target=http%3A//en.wikipedia.org/wiki/Slide_%28website%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Slide&i class=&icon-external&&&/i&&/a&(后被 Google 收购),并参与创立 Yelp,现担任 Yahoo 董事。Max Levchin被誉为 PayPal 黑帮的“军师”。&/li&&li&&b&Steve Chen&/b&(前工程师)、&b&Jawed Karim&/b&(前工程师)、&b&Chad Hurley&/b&(前设计师):联合创立了视频网站 YouTube。&br&&/li&&li&&b&Russel Simons&/b&(前工程师)、&b&Jeremy Stoppelman&/b&(前副总裁):联合创立了点评网站 Yelp。&/li&&li&&b&Premai Shah&/b&(前产品经理):担任非营利性小微金融机构 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Kiva_%28organization%29& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Kiva&i class=&icon-external&&&/i&&/a& 总裁,2009年入选财富杂志&40 Under 40&。&/li&&li&&b&Dave McClure&/b&(前市场总监):天使投资机构/创业孵化器 &a href=&///?target=http%3A//500.co/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&500 Startups&i class=&icon-external&&&/i&&/a& 创始合伙人。&/li&&li&&b&Keith Rabois&/b&(前副总裁):参与投资 LinkedIn、Slide、Square 等科技公司,并担任多家公司高管职位。&br&&/li&&li&&b&Roelof Botha&/b&(前CEO):现担任知名风投机构 Sequoia Capital(红杉资本)合伙人。&br&&/li&&li&&b&Yishan Wong&/b&(前工程师):现担任 reddit CEO。&br&&/li&&li&&b&Luke Nosek&/b&(创始人、前副总裁)、&b&Ken Howery&/b&(前CFO):担任 Founders Fund 合伙人。&br&&/li&&li&&b&David Sacks&/b&(前CEO):创立了社交网站 &a href=&///?target=http%3A//en.wikipedia.org/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Geni&i class=&icon-external&&&/i&&/a& 及 &a href=&///?target=http%3A//en.wikipedia.org/wiki/Yammer& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Yammer&i class=&icon-external&&&/i&&/a&。&/li&&/ul&&br&&br&资料来源:&br&[1] &a href=&///?target=http%3A///my-approach-to-investing/paypal-mafia/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&PayPal Mafia Infographic&i class=&icon-external&&&/i&&/a& / &a href=&///?target=http%3A///The-Start-up-Casnocha-Reid-Hoffman/dp//ref%3Dtmm_pap_title_0& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The Start-up of You&i class=&icon-external&&&/i&&/a&&br&[2] &a href=&///?target=http%3A///startups-with-billion-dollar-valuations-Fop%3D1& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&The 39 Most Valuable Startups In The World&i class=&icon-external&&&/i&&/a&&br&[3] &a href=&///?target=http%3A///profile/peter-thiel/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Peter Thiel - Forbes&i class=&icon-external&&&/i&&/a&&br&[4] &a href=&///?target=http%3A///profile/elon-musk/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Elon Musk - Forbes&i class=&icon-external&&&/i&&/a&&br&[5] &a href=&///?target=http%3A///profile/reid-hoffman/& class=& wrap external& target=&_blank& rel=&nofollow noreferrer&&Reid Hoffman - Forbes&i class=&icon-external&&&/i&&/a&
先上图[1]:""(PayPal 黑帮)指多位参与创立多家明星科技公司的 PayPal 创始人、前高管、员工。“PayPal 黑帮系”公司包括LinkedIn、YouTube、Tesla Motors、SpaceX、Solar City、Yelp、Palantir Technologies、Geni、Yammer、Kiva、Slide等。…
像@崔岩 说的那样,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否够大,还会考虑你走了一步之后,坡度是否会变得更大。所以,可以说牛顿法比梯度下降法看得更远一点,能更快地走到最底部。&br&&br&根据wiki上的解释,从几何上说,牛顿法就是用一个二次曲面去拟合你当前所处位置的局部曲面,而梯度下降法是用一个平面去拟合当前的局部曲面,通常情况下,二次曲面的拟合会比平面更好,所以牛顿法选择的下降路径会更符合真实的最优下降路径。&br&&br&wiki上给的图很形象,我就直接转过来了:&img src=&/365e99bcf8d2e1efcaef7_b.jpg& data-rawwidth=&220& data-rawheight=&253& class=&content_image& width=&220&&红色的牛顿法的迭代路径,绿色的是梯度下降法的迭代路径。&br&&br&参考:&br&&div class=&highlight&&&pre&&code class=&language-text&&http://en.wikipedia.org/wiki/Newton's_method_in_optimization
&/code&&/pre&&/div&
像@崔岩 说的那样,牛顿法是二阶收敛,梯度下降是一阶收敛,所以牛顿法就更快。如果更通俗地说的话,比如你想找一条最短的路径走到一个盆地的最底部,梯度下降法每次只从你当前所处位置选一个坡度最大的方向走一步,牛顿法在选择方向时,不仅会考虑坡度是否…
已有帐号?
无法登录?
社交帐号登录
4589 人关注
1021 个回答
7533 人关注
619 个回答
628 个回答
842 人关注
922 个回答}

我要回帖

更多关于 密密麻麻 的文章

更多推荐

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

点击添加站长微信