1-1 现代软件工程—构建之法》第一章总结
1、软件=程序+软件工程:正是因为对软件开发活动(需求分析( Requirement Analysis)、软件构架(Sofware Achitecure)、源代码管理(Source Code Control)、软件设计与实现(Software Design, Implementatin andDebug)、软件测试( Test)、项目管理( Project Management ))相关的内容的完成,才能完成把整个程序转化成为一个可用的软件的过程。
扩展的推论:软件企业=软件+商业模式
2、软件开发的不同阶段:玩具阶段→业余爱好阶段→探索阶段→成熟的产业阶段
3、软件所具有的特殊性:复杂性(Complexity)、不可见性(Invisibility)、易变性(Changeability)、服从性(Conformity)、非连续性(Discontinuity、由软件的本质所决定的)
软件还有其他特性:
(1)有许多不同的程序设计语言、软件工具和软件开发平台
(2)存在许多不同的软件开发流程
(3)软件团队中存在许多不同的角色
(4)软件通常既可以存储在磁带上,也可以存储在CD/DVD上
4、计算机科学( Computer Science)这一学术领域可以分为下面这些偏理论的领域:
(1)计算理论 ( Theoretical Computing )
(2)信息和编码理论( Information and Coding Theory )
(3)算法和数据结构( Algorithm and Data Structure)
(4)形式化方法( Formal Methods )
(5)程序设计语言 (Programming Language )
以及下面这些偏实践的领域:
(1)计算机体系结构( Computer Architecture )
(2)并行计算和分布式系统(Conuren, Pal and Dstributed System)
(3)实时系统和嵌人式系统( Real Time and Embedded System )
(4)操作系统(Operating System)
(5)计算机网络( Networking)
(6)科学计算(Scientific Computing)
(7)安全和密码学 (Security and Cryptography )
(8)人工智能( Artificial Intelligence )这个领域涵盖了许多相关的领域,如模式识别(PatternRecognition)、机器学习( Machine Learning)、数据挖掘( Data Mining)、信息提取( Information Retrieval)等。
(9)计算机图形学(ComputerGraphics)、计算机视觉(ComputerVision)、多媒体( Multimedia )
(10)数据库和大规模数据处理( Database and Large Scale Data Processing )
(11)万维网( World Wide Web )
(12)自然语言处理和语音( Natural Language Processing and Speech )
(13)人机交互( Human Computer Interaction )
(14)软件工程( Software Engineering )
5、作者邹欣总结的自己做过的项目的各自特点:
(1)Build To Learn:开发软件,构建系统的目的是做进一步的试验,试图发现客观规律或某个试验方法的优点与缺点。这些项目经常是科研论文的基础工作。
(2)Build To Show:为了突出地展现某个技术的作用,开发一些演示为目的的软件,这些项目很吸引眼球,经常获得新闻报道,但是功能未必全面。
(3)Build To Serve:为了服务一定范围的目标用户而构建的工具等,有时以公开的SDK形式发布。
(4)Build To Win:以在市场上赢得用户为目标而构建的软件。这也是种种科学发现,技术突破最好的试金石。这是我在研究院之外的十余年中做的最多的项目类型,也是这本书的英文名字。
1-2 教材P18-2
1、 软件开发是无用职业吗?(第5章)
在一个公众号看见这句话,国外一位软件工程师在与众多同事聊天中总结出一句话:对大多数人而言,软件工程开发是一个除工作之外无用的职业之一,这项技能在生活中几乎用不到。不少网友跟帖调侃称,平时还可以修修电脑、重装系统、清理电脑垃圾等。调查中,大多数软件开发工程师不会详细向家人介绍自己的工作,除非有人刨根问底,也有人曾因为介绍得过于详细而被家人拉去到处修电脑。虽然调侃成分居多,但也不免传递出一些心酸。实际上,软件开发工程师在产品生命周期中的作用非常重大,涵盖需求、设计、开发、修改、发布等多个环节,生活中也没有传说的那么无趣和无用。很多软件开发工程师擅长通过编码解决生活问题,比如编写一些软件或小程序自动运行部分重复且复杂的工作;为零售商店编写网站或者 APP,方便用户选购商品;为家居编写控制程序以达到智能目的;编写简单的日程提醒软件,以免忘记重要约会...... 有业内人士表态,是否有用取决于用户是否真的需要,只要需要就是软件开发工程师的价值所在。此外,在国外一线科技公司工作的软件开发工程师,比如谷歌、苹果,薪资水平早已达到年薪 100 万人民币左右。反观国内,2010 年的软件出口规模达到 215 亿元,软件从业人员达到 72 万人,虽然如此,但人才缺口依旧巨大,尤其是高素质软件工程人才,极度短缺。所以,在我看来这个岗位不是无用,而是顶尖人才尚未到位(需要我们不断学习啊!但愿头发没掉光)。
2、需求分析是什么?需要分析什么?(第8章)
需求分析,是一个将用户需求变成产品需求的过程。要做好用户需求的分析,需要找出来隐藏在用户需求背后的真实需求,还要针对用户的真实需求提出解决方案,最终验证方案是不是能满足好用户需求。需求是整个产品的源头,很多软件项目失败的原因就在于没有做好需求分析,软件中很多浪费也来源于需求没想清楚导致的返工。做好需求分析对于软件项目来说非常的重要。要做好软件项目的需求分析,需要做好需求的收集整理工作,然后对收集好的需求进行科学的分析,评估是不是可行以及划分优先级,对可行的需求项进行设计,最后还要验证设计出来的结果是不是满足需求。能科学地运用好需求分析的知识,对项目的需求分析把好关,保证最终产品能满足用户需求,超出用户预期。
3、如何避免无用代码堆积?(第11章)
在软件开发过程中,需求变更和代码修改是很正常的事情,但这个不确定性需要在一定范围内。对此,最佳的解决方案可能是迭代开发,也叫迭代增量式开发,将整个开发周期分解为若干时间段,每隔一段固定时间就对软件进行一次小迭代,每迭代几次就进行一次全面测试和大版本更新,对开发成果进行质量评审,这个过程最重要的是听取最终用户的意见,以便及时调整优化,避免无效需求,尤其是决策者拍脑门出来的决定。开发之前,技术负责人务必准备好相应文档,确定好各工程师的分工,尤其是需要协同完成的部分。另外,团队尽量抽出时间和精力进行代码 Review,并以降低代码复杂度为目标,如果不同工程师之间的代码间经常互相影响,可以考虑让这类程序员负责独立开发模块,降低对整个项目的影响。长期以来,测试在国内的重视程度并不够,一个测试团队起码应该有白盒测试、效率测试、单元测试等各类专职人员,不建议在所有功能完成之后才开始测试,最好是完成一个功能就马上交给测试,测试阶段应由测试完全掌握主动权,开发必须尊重测试人员的工作。归根结底,软件开发是一项非常复杂的工作,为了避免过程出错,很多公司已经摸索并建立了成熟且完整的代码编写规范,包括变量命名规则、层次化设计、类和接口设计,到最后的代码 Review 都很清楚,最重要的不是会写代码,而是学会解决问题,做真正有价值的事情。毫无疑问,软件工程开发是一项有价值且极具挑战的工作,这种价值不仅体现在工作中,很多优秀的软件产品已经对用户生活产生影响,这也是很多一线科技公司不可或缺的岗位,但价值到底有多大还要取决于做的人,如果开发者自身技艺不精,很容易弄巧成拙。
4、什么是好的用户体验?(第12章)
用户体验是消费者的实际感知和期望感知的差。这是一个很有名的关于产品体验的理论,用户对一个产品体验之前会有一个期望感知,也就是期望值,当体验完产品之后会有一个体验感知,也就是体验值,这两个值的差就是用户体验。用户体验是产品价值在用户层面上的体现。用户对一个产品的产品价值有着自我的理解,不同的主体用户对同一个客体会有着不同的理解,就像是一千个人心中会有一千个哈姆雷特一样,产品价值在用户心中会体现出不一样的理解,这种理解就是用户对一个产品的用户体验。用户体验是用户对产品调性的理解。这一点和上面一点类似,用户对一个产品的调性有着自己的理解,产品调性折射到用户身上就是用户的用户体验。用户体验就是培养用户的懒习惯。这一点就是一种偷懒和取巧式思考,张小龙说技术或者互联网的使命是帮助人类提升效率,提升效率会缩短用户创造同样价值的消耗时间,这本身就是一种懒。好的产品设计应该创造用户价值。好的设计会让让用户行为变得更简单,这本身也是一种偷懒的行为。有人说懒是人类进步的最大动力,其实可以说用户体验就是培养用户的懒习惯。
5、软件质量越来越差是开发的锅吗?(第14章)
一个优秀的软件开发工程师,必须对自己的产品负责。如今,一个手机就可以解决吃饭、休闲、出行、娱乐等各方面需求,只要几个 APP 就可以搞定全部,软件产品越来越多,但真正可以算得上颠覆性创新的东西却很少,基础软件的质量似乎越来越差,这个锅应该开发背吗?在 V2EX 上,某开发者深夜发表了一篇题为“底层开发性价比越来越低,基础软件的质量将会越来越差”的帖子,他表示,前半句是当前事实,后半句则是基于事实对未来的推断,也就是说,未来,基础软件的质量将会越来越差,这又从何说起呢?他认为,现在的年轻人中只有很小一部分愿意去维护和学习前人花费数十年时间,整理出的数千万行代码,基础软件的补丁质量在逐年下降。大部分年轻人不愿意做“平行世界的守护者”,更加赞同“不重复造轮子”的说法。随着市场对产品研发和迭代周期的要求越来越短,各种敏捷开发工具应运而生,与以往相比,同样的功能只需要很少的特定代码就可以实现,软件开发工程师花费的时间确实变少了,但对性能和用户体验的关注也在下降,这也导致大量软件流入市场,但整体质量却是在下降。当然,不少奋斗在一线的底层开发者对此也表达了不满,认为国内尚有很多开发者重视基础软件质量,并愿意更新迭代前人编写的底层代码,只是这个群体的话语权太少,被外界听到的声音太弱。当然,也有网友认为,这也不全是软件工程师的问题,很多公司在软件开发过程中往往是需求提了改,改了提,最终开发的产品成了一堆无用代码堆积;工期一再压缩,为了赶时间,大部分软件开发工程师不得已省去设计时间,自然没工夫评估项目效益和成本,后果往往是非常痛苦的修改和更新,不同开发者之间的协作也可能影响系统其他功能,导致整个软件开发流程漏洞百出。所以软件质量好坏不是单纯依靠软件开发工程师就可以解决的,这其中还涉及到多人协作,部门合作等问题(这个锅全部砸在工程师身上,也是有点痛)。
1-3 教材P18-3
微信(聊天工具)、知米背单词(学习)、王者荣耀(游戏)
1、如何说服我成为该软件用户的?开发目的?
(1)微信:我接触微信是因为当时可以与家人和朋友之间的聊天,而且可以支持视频聊天(在当时手机视频聊天并不多),并且可以移动支付,还可以将自己的动态分享朋友圈。微信上虽在提现上会有一定收费,在我看来也并不是靠这种方式盈利,在微信发展后续发展出微商、应用小程序、微信公众号等,其大大争取用户粘度才是他们的目的。
(2)知米背单词:在接触知米背单词之前都是用传统的书籍去背单词,但书籍并不能叫你发音还有携带不便并且随着智能手机的出现,出现能够利用碎片化时间学习的软件着实能够吸引到我,在该软件上若是普通背单词是免费的,而如果需要词根+联想背背单词,或是图片记忆都是需要额外收费的,在用户注册前期其很多付费功能也是免费的(时间一个月到三个月不等),试用期过后都是需要付费的(其目的可能是培养用户的消费习惯)。
(3)王者荣耀:王者荣耀是一款现象级网游:第一,具有极强的互动性;第二,有丰富的游戏元素;第三,与众不同的游戏特点;第四,无差别的玩家对待;第五,成熟的运营模式。 其盈利模式是:第一,直售皮肤,这个绝对能占到盈利的相当大一部分,尤其是限定和年度限定,以及各类合作皮肤都是很赚钱的,详情参考当天卖出一个亿的宝马赵云。第二,皮肤碎片,你肯定会问这玩意咋挣钱了,首先,每次活动都会偶尔送你几个皮肤碎片对不对,当你拥有了27个碎片,正巧,你的喜欢的英雄的伴生皮肤上架皮肤碎片商城,只差一个碎片哦。。而且我们商城准备了各种能拿的到的皮肤碎片礼包,快来买呀。。。只要一块钱,你就可以拥有,然后。。。。氪!于是腾讯又赚到了钱,英雄碎片同理。第三,花里胡哨的充值活动,让你忍不住冲钱,有克制能力除外嗷。。。然后你充值点券之后,你根本留不到等出去一个直售皮肤。。。因为,你会看到参加完充值活动,诶我还差几个皮肤碎片就可以换到白色死神了诶。。哇。。商城还有皮肤碎片的礼包。。还能概率给一次抽点券夺宝的机会,然后。。氪!第四,点券夺宝的终极奖励。荣耀水晶,武则天呀或者全系碎影,你只要充钱,你就会发现他给你的抽奖机会会累计一百多的幸运值。。然后。。你就会忍不住。。。氪!(总结起来这游戏玩的是人性啊!!!)
2、我是如何下载?当时在上几年级?软件感觉如何?
(1)微信:手机自带,当时已经高一,前期其简约的设计风格让我感到很舒服,功能也是越发稳定和强大,不过到现在因增加的功能不少其简约的风格也在渐渐消失。
(2)知米背单词:主动去应用商店下载的,下载时已经高二,在高二时候刚注册的时候,所有的功能都是免费的让我背单词背的很舒服,但在上大学期间很多的功能已经改成付费,但是整体效果还是不错的。
(3)王者荣耀:通过同学的QQ快传,当时大二,同学们都在玩,技痒了就想玩了,都是罪恶啊,感觉就是垃圾游戏,毁我青春(已退坑)。
3、这些软件是如何处理Bug的?又是如何更新版本的?
(1)微信: 通过微信软件内部的反馈功能来收集自身出现的BUg并加以改进,微信更新通常是自更新。
(2)知米背单词:在你注册前期开始背单词时就会让你对该软件进行打分与评价,也设计了反馈功能;在更新版本上通过通常是定期更新(平均一个月一次,除非出现大Bug)。
(3)王者荣耀:只要不出现充值问题的Bug那就不是Bug,更新方面是三天一小更,五天一大更。
4、同一类型软件之间是如何竞争的?
(1)微信:微信的竞争对手有QQ,陌陌,米聊等,QQ也是腾讯旗下的产品,并且对于QQ与微信,QQ偏于工作,微信偏于生活,因都是腾讯家的不存在实质上竞争(都是兄弟,打啥打啊),而陌陌(我没用过)推广力很足但其用户粘度确提不上来,导致感觉在即时通讯上已经被微信与QQ所垄断。
(2)知米背单词:背单词软件可谓是百花齐放,百词斩、扇贝单词、不背单词等软件层出不穷,但这些软件能良性竞争,开发更多的功能与背单词方式,能够方便用户的使用(所以本人也下了不少单词软件进行学习),总的来说受益的还是用户们(我爱学习,我爱背单词,嘿嘿)。
(3)王者荣耀:充钱使你强大(氪就完了)。