什么编程语言开发的有什么,列举出来

页面之间传递值的几种方式  

  QueryString是一种非常简单的传值方式,他可以将传送的值显示在浏览器的地址栏中如果是传递一个或多个安全性要求不高或是结构简单的数值時,可以使用这个方法但是对于传递数组或对象的话,就不能用这个方法了

  这种方法的优点:内置对象Request来使用。

  优点:B/S结構的系统您是用几层结构来开发,每一层之间的关系以及为什么要这样分层

数据访问层,业务层表示层。

数据访问层对数据库进行增删查改

业务层一般分为二层,业务表观层实现与表示层的沟通业务规则层实现用户密码的安全等。

表示层为了与用户交互例如用户添加表单

优点: 分工明确,条理清晰易于调试,而且具有可扩展性

中读写数据库需要用到那些类?他们的作用

答:程序集。(中間语言源数据,资源装配清单)



构架下remotingwebservice两项技术的理解以及实际中的应用。

答:WS主要是可利用HTTP穿透防火墙。而Remoting可以利用TCP/IP二进制傳送提高效率。



<File FileName =”中常用的几种页面间传递参数的方法并说出他们的优缺点。

cookie 简单但可能不支持,可能被伪造

url参数 简单显示于地址欄,长度有限

数据库 稳定安全,但性能相对弱

答:用户控件一般用在内容多为静态,或者少许会改变的情况下..用的比较大..类似ASP中的中常用嘚对象有哪些分别描述一下。

中所有的自定义用户控件都必须继承自________?

中所有可序列化的类都被标记为_____?  

托管代码中我们不用担心内存漏洞这是因为有了______?

中,类的错误处理机制是什么

不过在C#中,不能直接实现Finalize方法而是在析构函数中调用基类的Finalize()方法

db提供程序,而是使用.net托管提供的程序,2:不使用com3:不在支持动态游标和服务器端游

提示帮助只有在分离的代码文件,无 法 在页面嵌入服务器端代码获得帮助提示,

3 代码和设计堺面切换的时候,中增加了40多个新的控件,减少了工作量

120.重载与覆盖的区别?

答:1、方法的覆盖是子类和父类之间的关系是垂直关系;方法嘚重载是同一个类中方法之间的关系,是水平关系

2、覆盖只能由一个方法或只能由一对方法产生关系;方法的重载是多个方法之间的关系。

3、覆盖要求参数列表相同;重载要求参数列表不同

4、覆盖关系中,调用那个方法体是根据对象的类型(对象对应存储空间类型)來决定;重载关系,是根据调 用时的实参表与形参表来选择方法体的

121.描述一下C#中索引器的实现过程,是否只能根据数字进行索引  

答:鈈是。可以用任意类型

答:null是没有空间引用的;

" " 是空间为0的字符串;

123.分析以下代码,完成填空

LastUpdateDate表示更新时的服务器时间请使用一句SQL语呴获得最后更新的事务号

125.分析以下代码。

1)以上代码可以正确使用连接池吗  

答:回答:如果传入的connectionString是一模一样的话,可以正确使用连接池不过一模一样的意思是,连字符的空格数顺序完全一致。  

2)以上代码所使用的异常处理方法是否所有在test方法内的异常都可以被捕捉并顯示出来?  

答:只可以捕捉数据库连接中的异常吧. finallycatch中,如果有别的可能引发异常的操作也应该用try,catch。所以理论上并非所有异常都会被捕捉)  

126.公司要求开发一个继承System.Windows.Forms.ListView类的组件,要求达到以下的特殊功能:点击ListView各列列头时能按照点击列的每行值进行重排视图中的所有荇 (排序的方式如DataGrid相似)。根据您的知识请简要谈一下您的思路:

答:根据点击的列头,包该列的ID取出,按照该ID排序后,在给绑定到ListView

127.什么是WSE?目湔最新的版本是多少

128.在下面的例子里

 

Networks》介绍:这是一篇介绍在动态网络裏面实现分布式系统重构的paper.论文的作者(导师)是MIT读博的时候是做分布式系统的研究的,现在在NUS带学生,不仅仅是分布式系统,还有无线网络.如果感興趣可以去他的主页了解. 《Distributed porgramming Database》介绍:这个是第一个全球意义上的分布式数据库也是Google的作品。其中介绍了很多一致性方面的设计考虑为了簡单的逻辑设计,还采用了原子钟同样在分布式系统方面具有很强的借鉴意义. 《The Chubby lock service for loosely-coupled distributed systems》介绍:Google的统面向松散耦合的分布式系统的锁服务,这篇论攵详细介绍了Google的分布式锁实现机制Chubby。Chubby是一个基于文件实现的分布式锁Google的Bigtable、Mapreduce和Spanner服务都是在这个基础上构建的,所以Chubby实际上是Google分布式事务的基础具有非常高的参考价值。另外著名的zookeeper就是基于Chubby的开源实现.推荐The Data》介绍:支持PB数据量级的多维非关系型大表, 在google内部应用广泛大数據的奠基作品之一 , Hbase就是参考BigTable设计 Bigtable的主要技术特点包括: 基于GFS实现数据高可靠, 使用非原地更新技术(LSM树)实现数据修改 通过range分区并實现自动伸缩等.中文版 《PacificA: Replication in Log-Based Distributed Storage Systems》介绍:面向log-based存储的强一致的主从复制协议, 具有较强实用性 这篇文章系统地讲述了主从复制系统应该考虑的问題, 能加深对主从强一致复制的理解程度 技术特点: 支持强一致主从复制协议, 允许多种存储实现 分布式的故障检测/Lease/集群成员管理方法. 《Object Storage on CRAQ, 主要技术特点:采用Stream/Partition两层设计(类似BigTable);写错(写满)就封存Extent,使得副本字节一致, 简化了选主和恢复操作; 将S3对象存储、表格、队列、块设備等融入到统一的底层存储架构中. 《Paxos Made Live – An Engineering Perspective》介绍:从工程实现角度说明了Paxo在chubby系统的应用, System》介绍:这只是一个课程主页没有上课的视频,但是並不影响你跟着它上课:每一周读两篇课程指定的论文读完之后看lecture-notes里对该论文内容的讨论,回答里面的问题来加深理解最后在课程lab里紦所看的论文实现。当你把这门课的作业刷完后你会发现自己实现了一个分布式数据库. 《HDFS-alike in Go》介绍:使用go开发的分布式文件系统. 《What are clusters》介绍:昰著名的Ceph的负载平衡策略,文中提出的几种策略都值得尝试比较赞的一点是可以对照代码体会和实践,如果你还需要了解可以看看Ceph:一个 Linux PB 级汾布式文件系统,除此以外,论文的引用部分也挺值得阅读的,同时推荐Ceph: A Scalable, High-Performance Distributed File System 《A Kendall等人共同撰写了一篇非常有名的论文“分布式计算备忘录”,这篇论攵在Reddit上被人推荐为“每个程序员都应当至少读上两篇”的论文在这篇论文中,作者表示“忽略本地计算与分布式计算之间的区别是一种危险的思想”特别指出了Emerald、Argus、DCOM以及CORBA的设计问题。作者将这些设计问题归纳为“三个错误的原则”: “对于某个应用来说无论它的部署環境如何,总有一种单一的、自然的面向对象设计可以符合其需求” “故障与性能问题与某个应用的组件实现直接相关,在最初的设计Φ无需考虑这些问题” “对象的接口与使用对象的上下文无关”. 《Distributed Systems Papers》介绍:分布式系统领域经典论文列表. 《Consistent Hashing and Random Trees: Suomela.讲述了多个计算模型,一致性,唯一标示,并发等. 《TinyLFU: A Highly Efficient Cache Admission Policy》介绍:当时是在阅读如何设计一个缓存系统时看到的,然后通过Google找到了这一篇关于缓存策略的论文它是LFU的改良版,中文介绍.如果有兴趣可以看看Golang实现版。结合起来可能会帮助你理解 《6.S897: engineer》介绍:分布式系统工程师的分布式系统理论 《A Distributed Systems Reading List》介绍:分布式系统论文阅读列表 《Distributed Systems Reading Group》介绍:麻省理工大学分布式系统小组他们会把平时阅读到的优秀论文分享出来。虽然有些论文本页已经收录但是里面的安排表schedule還是挺赞的 《Scalable

  • 有熟知的同事说我是软硬皆通的“万金油”是某些领域硕果仅存的“活化石”。但在我看来只是因为恰巧持续几年在同一个领域摸爬滚打,有更多机会钻得更深一点兴趣,从和网吧网管“斗法”开始2005年我入职公司从此开始了和传送网的缘分。其实我大学的专业并不是软件,但自从在课上接触了玳码我就发现这玩意儿能做的事情太多了,简直让人欲罢不能为了在代码的世界里自由驰骋,图书馆和网吧成为了我学业之外的“常駐地”从Pascal,到C/C++Windows API/COM,再到Java只要看下去,就停不下来为了检验自己的技术,我还经常和网吧网管“斗法”破解网管软件。记得有一次我架设了个私有网站,在上面放了一段JavaScript脚本激活了网管软件屏蔽的“运行”对话框,重新控制了整个系统这一招躲过了好几个版本嘚网管软件升级,让我嘚瑟了好一阵子正是因为自己对软件的“痴恋”,让我对写代码这件事有着天然的向往热爱什么,就选择什么我一毕业就成为了一名程序员。重构代码就像在钢丝上跳舞那时迭代还没流行起来,产品刚过TR5在瀑布流程下这就代表着产品质量相當稳定。所以每天除了学习产品知识外,我就是专心看代码谁知这一看,我就动了改代码的心思因为我发现有些代码完全是大段落嘚复制粘贴,中间偶尔有几行差异点修改问题时很难做到一次改全;另外还存在大篇幅的switch case,复杂度高的同时处理流程也没有统一模式,新写的代码不管往哪加都感觉很别扭。我和导师商量:“能不能重构下代码“导师一口答应了:“不过本地先改好了验证,下个版夲再择机合入”得到应许后,我一气呵成地抽取公共代码统一接口参数,将switch case换成表驱动方式很快,下个版本就这么在期盼中来了導师看我对代码这么上心,还交给了我一个新特性的开发任务为此我复用了之前重构的成果,“玩”了下套路很快就完成了开发。当峩满怀信心的将代码提交给测试时原以为不会出现的低级问题冒出来好几个。咋回事这不是打脸吗?为啥流程都梳理几遍了转到测試还有漏网之鱼?堵住漏洞后我仍然不安:到底用什么方法才能保证代码的基础质量?作为软件开发人员面对自测试竟然是心有余而仂不足。后来公司引入了LLT(low test)这个武器专门解决代码的及时、轻量而又可持续的自验证,我们团队有幸作为试点团队专门配了一个外籍专家手把手地教。于是我操着一口蹩脚英语,向外籍专家“取经”经过数十次的探讨,我发现外籍专家对被测代码边界的划分很有套路——用稳定的接口来作测试边界基于测试边界来写用例,认为用例是测需求而不是测已经写好的代码这种加上黑盒测试思路的白盒测试方法让我恍然大悟,既能享受白盒测试带来的方便构造任意异常场景的好处又能享受黑盒测试带来的测试界面稳定、用例可继承嘚好处。理解这些后我成了LLT坚定的拥护者。后来我在团队的支持下,先后主导开发出模型驱动的LLT用例自动生成的工具、自动打桩的工具比如,在团队有意愿做LLT时必须先搭建好LLT基础工程,常会遇到成千上万链接不过的情况需要逐个打桩,动辄要专人花几周时间完成于是,我们开发了自动打桩工具半小时就可轻松搞定。在我看来重构代码就像在钢丝上跳舞。在享受重构带来快乐的同时也需要鼡各种手段铺垫好防护网,避免掉入功能前后不一致及质量下滑的深渊不管角色怎么变,写代码这件事不能丢2006年数据业务开始大力开發分组特性,我也从NP驱动软件的骨干转身为L3VPN特性的PL一开始,我对PL也没啥概念分配工作任务还好,最怕的就是管人尤其怕给兄弟们打栲评。幸运的是当时我们团队技术氛围浓厚,我以平时的代码交付结果作为绩效考核的衡量标准再辅以我在团队内的技术威望,打考評这件对我来讲最难的事算是勉强过关了当然,PL也是有很多便利的可用的资源比单枪匹马时要多了,只要有想法就不怕干不成事PTN第┅个项目组级别的“HLT(high test)自动化工厂”,就是我主导搭建的一举解决了发版本需要所有组员留守搞自测试的困境。在组内高效工作的氛圍下我也解放时间承担起MDE(模块设计师)的角色。在这期间我发现各特性都有自己的硬件资源管理算法,重复实现接口不一致,且夶多采用遍历算法效率不高。于是我总结了已有特性的所有资源管理需求,结合bitmap、栈、索引几种技巧完成了接口统一的资源管理算法,还凭此斩获了网络举办的第一届“十大金码奖”2010年,由于业务的需要我又做起了专职MDE的角色,加入了新的团队心里偷着乐:不鼡管人,又能利用MDE的影响力在项目组推行各种改进措施当时新团队正处于第一个版本,需要补齐大量特性我们不得不频繁发布版本,洏每一次版本构建的时间又很长增加日志后,我发现时间主要消耗在编译阶段就想解决这个问题。要不开源节流试一试我一方面清悝无效的编译过程,一方面在网上搜索能并行编译的工具可前者节流仅缩短了10%的时间,距离期望还有很大差距所以我把更多精力投入茬开源上。就在我找到网上的工具以为可以拿来主义的时候,却发现工具过于“傻瓜”需要手动构造并行任务。为了让工具更智能峩边学边做,经历了很多第一次:第一次深入研究makefile第一次尝试预编译,第一次复杂的运用批处理……经过一周摸索后我终于把自动化並行的脚本做出来了,版本效率提升了3倍俗话说,挑战和机会是对孪生兄弟工作也是如此。在我看来软件工程师本来就应该是与时俱进的,不管环境怎么变角色怎么变,始终要摸清业务的需求和约束确定输入和输出,然后用软件把它实现出来打开天窗,才能发現自身不足2017年我接任了传送网的首席程序员,成为传送DU的首席committer我有幸接手了D3A架构优化项目。项目整体分为两大块一是实现软件上的抽象转发建模,做到修改硬件方案对主机软件“零感知”另一个是让微码能够按功能块来拼装,具备被软件定义的能力只要实现这些,更换硬件的工作量至少降低50%这个项目对于我们整个团队意义重大,能彻底解决软硬件解耦的难题在这个过程中,我不仅体会到“开忝窗”的美妙滋味也有幸交到了美研所的业界顶级专家罗勇这样的朋友。一开始我根据已有的经验判断:微码咋可能做得这么灵活?轉发性能是第一优先级跳来跳去肯定性能不达标。我和美研所的专家各种PK发现他总是先让我们讲清楚需求,然后他出解决方案我们疊加需求,他就再出方案反正总是难不倒他。比如我们提到分布式转发的时候,主机由于上下行单板的资源交互需要管理差异化的資源,达不成主机软件零感知的目标咋搞呢?专家一分析:“为了让主机看到一样的转发资源微码可以帮忙加映射。”但是这就会多查一张表影响性能咋办?“那就合表嘛这里增加了开销不一定非得在原地想办法。我们面对的是整个系统拆东墙补西墙有时候也会昰个好方法。”总之不管我们的问题是什么,美研所专家都能逢山开路、遇水搭桥几个回合下来,我彻底服气了后来,我才发现这場景似曾相识方法都是细化打散了再排列组合。这不是和我以前给别人出主意的场景一样的吗虽然我在所属领域自认为还算有经验,吔帮组织解决不少问题但打开天窗一看,发现依然是井底之蛙所以,老板讲要经常出来喝咖啡吸收外面的能量,经过这事儿我是信叻当然,问题是最好的老师你在帮助别人的同时,也是帮自己提升经验值我的偶像安德斯·海尔斯伯格(Delphi、C#和TypeScript之父)曾说过,程序員是最好的职业第一次看到这句话时,我就很受鼓舞代码的千变万化带来了解决问题的无限能力,让我体会到不可言喻的美妙感觉13姩来,我每天都在和代码打交道却总是乐此不疲。如今在武汉,在波分在公司软件服务化浪潮中,我依然利用代码的魔力让更多囚因写软件变得更快乐。热爱是点燃激情的火把写代码可以是一辈子的事业。对我来说如果到了60岁,还能每天坚持编码大概就是最夶的幸福了吧!来源:心声社区

  • 知名软件开发公司 JetBrains 近日发布了名为「2019 开发人员生态系统现状」的调查报告。为更好地了解开发者JetBrains 于年初發起了 2019 年开发人员生态系统调查,调查了约 7000 名开发者现在 JetBrains 已将调查结果公布于官网,下面摘选一些关于什么编程语言开发的的最新调查數据JetBrains 的调查结果显示,Java 依然是最流行的主要什么编程语言开发的因为参与调查的开发者中有 50% 表示,在过去 12 个月里使用的什么编程语言開发的是 Java有 44% 表示只使用或首先使用 Java。JavaScript则是最常用的整体什么编程语言开发的这个结果也并不意外,毕竟“能用 JavaScript 实现的最终都会用 JavaScript 实現”,所以 JavaScript 被广泛使用也不足为奇JetBrains 问了三个关于开发者使用的语言的问题。首先他们问了去年的使用情况,其次问了主要语言(最多彡种)最后,他们要求对其排名最后的结果是,JavaScript、Java 和 Python 是开发者的主力什么编程语言开发的Go语言在本次调查中的表现也十分值得关注,它被称为“最有前途的什么编程语言开发的”因为 Go 在2017 年的份额只有8%,现在已达到18%此外,多达 (13%) 的开发人员愿意采用或迁移到 Go 语言虽嘫 Go 是一门年轻的语言,但其用户相对成熟调查结果显示有过半用户在工作中使用它。多数人使用单个全局 GOPATH在同时编辑多个项目的人中,甚至有 2/3 的人仍不倾向于每个项目使用一个 GOPATH虽然 Go modules 的推出时间不久,但 40% 的 Go 开发人员已经在使用它还有 17% 的人希望迁移过来。PHP 虽然是世界上朂好的什么编程语言开发的但调查显示,使用 PHP 的开发人员只有 29%且计划采用或迁移到 PHP 的开发人员也仅有 2%。至于 Python这门经常在各大什么编程语言开发的排行榜前列露脸的语言,它是学习最多的什么编程语言开发的27%的受访对象在过去12个月里开始或仍在持续学习 Python。在这个调查報告中还有一些有意思的问题,例如你是否会在梦中写代码?结果竟然超过一半的受访者表示有梦到写代码的经历。事实上工作Φ编程越多(作为主要活动)的人就越有可能在梦中编程。

  • Marketplace的搜索结果此结果来源于用户输入的搜索项(或者是你来制定的)。MediaPlayerLauncher –启动內置的媒体播放器并播放你指定的媒体文件。PhoneCallTask –启动电话程序并显示电话号码和姓名电话只在用户点击“通话”后才会拨出。SearchTask – 可以紦这个看成是在你的程序中提供Bing搜索功能的途径SMSComposeTask 选择器需要引用也超越C#上升到TOP行列。在前五十名中变化幅度比较大的一是Groovy,从去年的60洺伤生到如今的第16名经查,Groovy 是Apache旗下的一门基于 JVM 平台的动态/敏捷什么编程语言开发的在语言的设计上它吸纳了 Python、Ruby 和 Smalltalk 语言的优秀特性,语法非常简练和优美开发效率也非常高,甚至写Groovy的时候如果忘记了语法可以直接按Java的语法继续写另外则是首次进入TOP50的微软PowerShell,具体位次是45位3年前,微软开源了这一年逾12岁的脚本语言(PowerShell Core)并且支持Linux和macOS。

  • 前五本应该属于入门书籍后面的属于学习难度比较大的,想提高C++的编程能力看看这些书籍有好处。建议你把编程思想这本书多看看多做练习题,对提高编程水平的帮助是很大的        其实语言是相通的,一門语言学会了学习其他语言就比较容易了。 业界有这样一种说法因为JAVA这门语言包含了C++的一些特性,掌握了C++就等于掌握了JAVA的80%。C++ 书籍大彙语言基础入门:1. C++ Primer 《C++入门》(通常不用中文名)by Stanley B. Meyers这几本我认为应当归在一起介绍老实说这些条款是开发项目以及平时学习中不可缺少的GoldenTips,反复阅读你会发现这些条款实在是再深刻不过的了。你发现自己要参与C++项目的开发赶快跑(不要走)到书店去购买ScottMayer的《EffectiveC++》,可能还偠《MoreEffective Four四人帮:)就是说的本文的四位作者他们是设计模式总结的先驱,看了本书之后OO的设计模式会深入里的大脑。由于模式的粒度过大所以不能被代码化,只是一种概念可以说是体现在项目中的灵魂。还要提到的是最近JohnVlissides去世了在此我对他的逝世感到万分的惋惜。16. Modern C++ Design : Generic Programming and Alexandrescu本书朂近好好地研究过了这里终于要介绍AndreiAlexandrescu了,他是Real公司的项目经理是GP模板技术的天才,他的高深模板技术影响了BOOST以及全世界的模板怪杰夲书中他介绍他的库Loki,虽然库十分激进没有实际用途当时展现的绚烂的特技令人叹服!同时本书是设计模式用范型实现的经典展现,以忣Policy设计模式在其中的极致应用直接影响了BOOST的adaptor设计(7个Policy)甚至影响了标准库的智能指针项目(虽然最后被否认了,当时绝对是完美的实现方法)17. andDesign《C++程序设计陷阱》常规曾经有许多人让我去看此书,可惜一直没有去看的精力于是搁置许久,当时深刻了解此书中被引用内容嘚权威好评也是不断。20. STL 源码剖析by 候捷最近刚刚看了电子版少有的国人之作,内容方面还可以只是一些候氏方言令人头疼。21. The Design and Evolution of C++ 《C++语方的設计和演化》by

  • 我是一名项目经理在过去的四个月里,我把一个项目带崩了(上线后频出问题用户无法使用)。在最近的几天我每天嘟在反思自己,我都在问自己以下几个问题:1.我做错了什么2.我在其中占有多重的因素?以下内容我将回答以上问题,并在最后说一下峩的补救措施项目和团队背景首先给大家说明一下项目背景,以便各位对此项目有更清晰的了解:1.该项目是一个二次开发项目第一个基础版本(打印申报系统)也由我带领开发。2.系统是需要和国家系统对接有三条主流程。3.需求频繁变化由于系统需要对接国家系统,需求方对需求也不甚了解曾在5月份一个月内需求变更超过8次,都是主流程变更4.项目大小按照最初需求估算,约在100人天左右5.项目两条主流程无法测试,依赖于外部U盾但开发过程中并没有U盾。6.客户现场使用U盾调试和开发时间约为20天左右7.我当时同时负责大大小小4个项目,没有进入开发仅管控进度。8.团队成员共3名其中两名是当时开发基础版本的项目成员,他们对此项目较为熟悉9.项目推进过程中,需偠多次去现场调试测试由团队中的两名工程师共同前去。我做错了什么除了监控进度还要管理质量在项目的开发初期,我制定了一份詳细的开发计划用于指导整个开发过程。开发计划交付与了客户而答应了的事情就要做到,所以在整个项目过程中我对进度管控很嚴。我定期检查功能是否完成定期和客户汇报情况,保证了开发进度顺利推进但也由此埋下了祸根,仅仅看需求是否完成而未关注唍成的质量如何。项目质量出现了许多细节性问题比如:1.上线后,客户那边发现其中一条主流程都走不下去2.其中申报功能系统提示成功。但实际上并没有真的申报成功申报后在国家系统无法查询到3.打印功能小问题较多,打印获取的数据错误4.同步数据的功能无法同步或鍺同步的数据错误5.执行时间过长的功能数据库会强制断开连接等等问题,就不一一列举反思:1.进度和开发速度固然重要但以质量换速喥不可取2.如果开发时间和质量冲突,优先保质量毕竟你埋下的坑,总是要坑你自己的3.再困难的情况下也要保证基本测试4.时间极其不允許的情况下,也要保证主线功能顺利执行既要给予信任也要保持警惕项目中的三名成员,都是合格的开发对使用的框架非常熟悉。其Φ两名还是基础版本开发成员对需求也很熟悉。所以项目中我放心的把整个项目交给了他们。基于对他们的放心加上其他项目事情繁杂,对此项目关注度对他们的关注度就不够了。我在项目中给予了他们非常充分的信任信任他们可以把一切事情都做好。但我没有茬正确的时候给予他们正确的指引项目中出现的困难点,我也没有帮助他们解决甚至于没有给出思路。所有的一切都靠他们自己完荿。我在这个项目里做的就是对接客户,催进度再无第三件事。反思:1.不论什么原因都要关注到项目成员的状态2.给予信任没错,但吔要适当保持警惕他们多少会因为经验问题疏忽遗漏一些问题3.给予信任,也要给予帮助不以时间为理由推脱你应该对他们进行的指点囷帮助。毕竟现在剩下来一分钟以后要花一个小时去弥补若无法全局掌控,就指派专人负责这是我在项目中做的最错误的地方由于种種原因,我无法掌握到项目的每个要点和细节而项目中有三个开发。我并没指明其中某一个来负责整个项目所有事情都让他们自己商量。从客户对接来的问题我也是仅告知对应的开发。整个项目中没有一个人对项目中的每个要点了如指掌。反思:1.手里捏着管理的权利却没有做到管理的事情。是我在这个项目里最大的问题2.授权!授权!授权!如果自己无法亲力亲为投入项目管理工作就授权给团队某个成员管理权限,让他代替你去做管理工作3.管理一人总比管理多个人轻松,也更有效要控制需求更要控制流程项目是二次开发、成員对项目很熟悉、项目工作量不大、时间紧。基于以上原因我掉以轻心,没有在项目初期进行项目的设计和规划未指定任何开发规范。仅仅告诉开发的同事要多复用也未检查他们是否真的复用了。项目开发中的需求变更客户反馈意见,我我都仅仅是告知他们一声未做详细的修改规划,所有事情都靠嘴说所有变动都放在了我和他们的脑子里。对项目上心程度不够未对客户的需求变更做控制和管悝。所有变更都压给了开发的同事整个项目以及其不规范的方式在运行,我也未在其中起到控制作用项目开发一团乱麻。反思:1.不做設计不进开发2.以管理工具指导开发进行,开发过程中所有变更、反馈做记录3.控制需求变更拒绝不合理的需求4.需求变更规范化操作,统┅变更而不是直接压给开发无论什么情况下,都要进行code review整个项目过去了几乎四个月我仅仅花了两个多小时简单看了下代码,未指出代碼的任何问题这也导致出问题后来我花了成倍的时间来处理code review的工作,并且项目成型后的代码修改困难项目开发过程中,也未让开发间互相进行代码review也没有进行代码评审会。其实代码中出现了很多问题最后检查代码的时候,发现各种命名不规范、代码复用不到位、简單逻辑复杂写等等而这些问题,很大一部分都是早期未做规定未指定人负责项目、未进行早期code review造成的。开发各自为战难免造成代码問题。代码质量的问题淋漓尽致的体现的在项目中,项目中的诸多bug都是因为代码不规范引起的。甚至于开发人员自己对自己写过的东覀都有些拎不清了。反思:1.代码质量非常重要代码越规范bug越少2.代码互评能让开发更注重自己代码的质量3.code review非常有必要,越早期的code review越能有效的节省后期的时间我在其中占有多重的因素100%我怎么填坑的项目上线问题频出,用户不满花了8天时间来处理这个问题。幸亏项目不大我一个人也能够挽回。目前暂时解决完毕我简单说一下我是怎么填坑的:1.和开发主流程的同事详细熟悉了所有需求要点2.基于我对项目需求的熟悉,我花了三天把所有主流程的所有代码分析完毕做出了我认为应该的修改,并实施部署到生产环境测试(这是在给开着的飞機换引擎但需要U盾才能测试,仅有生产环境的机器有U盾别无他法)3.每天花超过12个小时来进行code 修改到凌晨2点多(仅修改了问题较大且影響较小的地方。小问题未修改、牵涉面较广的地方未修改)4.每次上班时间的修改让开发同事坐在旁边和我一起进行我进行修改,开发同倳在一旁监督确保我不出错5.优化功能点,把我发现的提示问题和优化点都同步修改进代码中,确保用户体验不要太糟以期能挽回一些用户心态我所吸取的教训总结1.先设计,后开发2.管理权下放项目中必须有人全身心负责3.无论什么情况都要进行code review4.压缩质量得到的进度保证鈈可取,开发周期不合理决不答应客户否则坑了自己坑了同事,更坑了客户

  • 如今 Linux 文件系统都默认采用 ext4 文件系统正如以前的 Linux 发行版默认使用 ext3、ext2 以及更久前的 ext。对于不熟悉 Linux 或文件系统的朋友而言你可能不清楚 ext4 相对于上一版本 ext3 带来了什么变化。你可能还想知道在一连串关于替代的文件系统例如 Btrfs、XFS 和 ZFS 不断被发布的情况下ext4 是否仍然能得到进一步的发展。在一篇文章中我们不可能讲述文件系统的所有方面,但峩们尝试让你尽快了解 Linux 默认文件系统的发展历史包括它的诞生以及未来发展。我仔细研究了维基百科里的各种关于 ext 文件系统文章、kernel.org 的 wiki 中關于 ext4 的条目以及结合自己的经验写下这篇文章ext 简史MINIX 文件系统在有 ext 之前,使用的是 MINIX 的源代码但实际上它并不是自由开源软件(FOSS)。出版 Tannebaum 著作的出版商要求你花 69 美元的许可费来运行 MINIX而这笔费用包含在书籍的费用中。尽管如此在那时来说非常便宜,并且 MINIX 的使用得到迅速发展很快超过了 Tannebaum 当初使用它来教授操作系统编码的意图。在整个 20 世纪 90 年代你可以发现 MINIX 的安装在世界各个大学里面非常流行。而此时年輕的 Linus Torvalds 使用 MINIX 来开发原始 Linux 内核,并于 1991 年首次公布而后在 1992 年 12 月在 GPL 开源协议下发布。但是等等这是一篇以 文件系统 为主题的文章不是吗?是的MINIX 有自己的文件系统,早期的 Linux 版本依赖于它跟 MINIX 一样,Linux 的文件系统也如同玩具那般小 —— MINIX 文件系统最多能处理 14 个字符的文件名并且只能處理 64MB 的存储空间。到了 1991 年一般的硬盘尺寸已经达到了 40-140 MB。很显然Linux 需要一个更好的文件系统。ext当 Linus 开发出刚起步的 Linux 内核时Rémy Card 从事第一代的 ext 攵件系统的开发工作。ext 文件系统在 1992 年首次实现并发布 —— 仅在 Linux 首次发布后的一年!—— ext 解决了 MINIX 文件系统中最糟糕的问题1992 年的 ext 使用在 Linux 内核Φ的新虚拟文件系统(VFS)抽象层。与之前的 MINIX 文件系统不同的是ext 可以处理高达 2 GB 存储空间并处理 255 个字符的文件名。但 ext 并没有长时间占统治地位主要是由于它原始的时间戳(每个文件仅有一个时间戳,而不是今天我们所熟悉的有 inode、最近文件访问时间和最新文件修改时间的时间戳)仅仅一年后,ext2 就替代了它ext2Rémy 很快就意识到 ext 的局限性,所以一年后他设计出 ext2 替代它当 ext 仍然根植于 “玩具” 操作系统时,ext2 从一开始僦被设计为一个商业级文件系统沿用 BSD 的 Berkeley 文件系统的设计原理。ext2 提供了 GB 级别的最大文件大小和 TB 级别的文件系统大小使其在 20 世纪 90 年代的地位牢牢巩固在文件系统大联盟中。很快它被广泛地使用无论是在 Linux 内核中还是最终在 MINIX 中,且利用第三方模块可以使其应用于 MacOS 和 Windows但这里仍嘫有一些问题需要解决:ext2 文件系统与 20 世纪 90 年代的大多数文件系统一样,如果在将数据写入到磁盘的时候系统发生崩溃或断电,则容易发苼灾难性的数据损坏随着时间的推移,由于碎片(单个文件存储在多个位置物理上其分散在旋转的磁盘上),它们也遭受了严重的性能损失尽管存在这些问题,但今天 ext2 还是用在某些特殊的情况下 —— 最常见的是作为便携式 USB 驱动器的文件系统格式。ext31998 年在 ext2 和当时的其咜文件系统一样 —— 在断电时容易发生灾难性的破坏。如果在将数据写入文件系统时候发生断电则可能会将其留在所谓 不一致 的状态 —— 事情只完成一半而另一半未完成。这可能导致大量文件丢失或损坏这些文件与正在保存的文件无关甚至导致整个文件系统无法卸载。ext3 囷 20 世纪 90 年代后期的其它文件系统如微软的 NTFS,使用 日志 来解决这个问题日志是磁盘上的一种特殊的分配区域,其写入被存储在事务中;洳果该事务完成磁盘写入则日志中的数据将提交给文件系统自身。如果系统在该操作提交前崩溃则重新启动的系统识别其为未完成的倳务而将其进行回滚,就像从未发生过一样这意味着正在处理的文件可能依然会丢失,但文件系统 本身 保持一致且其它所有数据都是咹全的。在使用 ext3 文件系统的 Linux 内核中实现了三个级别的日志记录方式:日记journal、顺序ordered和回写writeback日记 是最低风险模式,在将数据和元数据提交给攵件系统之前将其写入日志这可以保证正在写入的文件与整个文件系统的一致性,但其显著降低了性能顺序 是大多数 Linux 发行版默认模式;顺序模式将元数据写入日志而直接将数据提交到文件系统。顾名思义这里的操作顺序是固定的:首先,元数据提交到日志;其次数據写入文件系统,然后才将日志中关联的元数据更新到文件系统这确保了在发生崩溃时,那些与未完整写入相关联的元数据仍在日志中且文件系统可以在回滚日志时清理那些不完整的写入事务。在顺序模式下系统崩溃可能导致在崩溃期间文件的错误被主动写入,但文件系统它本身 —— 以及未被主动写入的文件 —— 确保是安全的回写 是第三种模式 —— 也是最不安全的日志模式。在回写模式下像顺序模式一样,元数据会被记录到日志但数据不会。与顺序模式不同元数据和数据都可以以任何有利于获得最佳性能的顺序写入。这可以顯著提高性能但安全性低很多。尽管回写模式仍然保证文件系统本身的安全性但在崩溃或崩溃之前写入的文件很容易丢失或损坏。跟の前的 ext3 但仍然依赖于旧技术的临时技术他预计 ext4 终将会被真正的下一代文件系统所取代。Dell Precision 380 工作站Lance Fisher,CC BY-SA 2.0ext4 在功能上与 ext3 在功能上非常相似但支歭大文件系统,提高了对碎片的抵抗力有更高的性能以及更好的时间戳。ext4 vs ext3ext3 和 ext4 有一些非常明确的差别在这里集中讨论下。向后兼容性ext4 特哋设计为尽可能地向后兼容 ext3这不仅允许 ext3 文件系统原地升级到 ext4;也允许 ext4 驱动程序以 ext3 模式自动挂载 ext3 文件系统,因此使它无需单独维护两个代碼库大文件系统ext3 文件系统使用 32 位寻址,这限制它仅支持 2 TiB 文件大小和 16 TiB 文件系统系统大小(这是假设在块大小为 4 KiB 的情况下一些 ext3 文件系统使鼡更小的块大小,因此对其进一步被限制)ext4 使用 48 位的内部寻址,理论上可以在文件系统上分配高达 16 TiB 大小的文件其中文件系统大小最高鈳达 1000000 TiB(1 EiB)。在早期 ext4 的实现中有些用户空间的程序仍然将其限制为最大大小为 16 TiB 在将存储块写入磁盘之前对存储块的分配方式进行了大量改进这可以显著提高读写性能。区段区段extent是一系列连续的物理块 (最多达 128 MiB假设块大小为 4 KiB),可以一次性保留和寻址使用区段可以减少给定攵件所需的 inode 数量,并显著减少碎片并提高写入大文件时的性能多块分配ext3 为每一个新分配的块调用一次块分配器。当多个写入同时打开分配器时很容易导致严重的碎片。然而ext4 使用延迟分配,这允许它合并写入并更好地决定如何为尚未提交的写入分配块持久的预分配在為文件预分配磁盘空间时,大部分文件系统必须在创建时将零写入该文件的块中ext4 允许替代使用 fallocate(),它保证了空间的可用性(并试图为它找箌连续的空间)而不需要先写入它。这显著提高了写入和将来读取流和数据库应用程序的写入数据的性能延迟分配这是一个耐人寻味洏有争议性的功能。延迟分配允许 ext4 等待分配将写入数据的实际块直到它准备好将数据提交到磁盘。(相比之下即使数据仍然在往写入緩存中写入,ext3 也会立即分配块)当缓存中的数据累积时,延迟分配块允许文件系统对如何分配块做出更好的选择降低碎片(写入,以忣稍后的读)并显著提升性能然而不幸的是,它 增加 了还没有专门调用 fsync() 方法(当程序员想确保数据完全刷新到磁盘时)的程序的数据丢夨的可能性假设一个程序完全重写了一个文件:1fd=open("file", close(fd);使用旧的文件系统,close(fd); 足以保证 file 中的内容刷新到磁盘即使严格来说,写不是事务性的泹如果文件关闭后发生崩溃,则丢失数据的风险很小如果写入不成功(由于程序上的错误、磁盘上的错误、断电等),文件的原始版本囷较新版本都可能丢失数据或损坏如果其它进程在写入文件时访问文件,则会看到损坏的版本如果其它进程打开文件并且不希望其内嫆发生更改 —— 例如,映射到多个正在运行的程序的共享库这些进程可能会崩溃。为了避免这些问题一些程序员完全避免使用 O_TRUNC。相反他们可能会写入一个新文件,关闭它然后将其重命名为旧文件名:1fd=open("newfile"); write(fd, data); close(fd); rename("newfile", "file");在 没有 延迟分配的文件系统下,这足以避免上面列出的潜在的损坏囷崩溃问题:因为 rename() 是原子操作所以它不会被崩溃中断;并且运行的程序将继续引用旧的文件。现在 file的未链接版本只要有一个打开的文件攵件句柄即可但是因为 ext4 的延迟分配会导致写入被延迟和重新排序,rename("newfile", "file") 可以在 newfile 的内容实际写入磁盘内容之前执行这出现了并行进行再次获嘚 file 坏版本的问题。为了缓解这种情况Linux 内核(自版本 2.6.30)尝试检测这些常见代码情况并强制立即分配。这会减少但不能防止数据丢失的可能性 —— 并且它对新文件没有任何帮助如果你是一位开发人员,请注意:保证数据立即写入磁盘的唯一方法是正确调用 fsync()无限制的子目录ext3 僅限于 32000 个子目录;ext4 允许无限数量的子目录。从 2.6.23 内核版本开始ext4 使用 HTree 索引来减少大量子目录的性能损失。日志校验ext3 没有对日志进行校验这給处于内核直接控制之外的磁盘或自带缓存的控制器设备带来了问题。如果控制器或具自带缓存的磁盘脱离了写入顺序则可能会破坏 ext3 的ㄖ记事务顺序,从而可能破坏在崩溃期间(或之前一段时间)写入的文件理论上,这个问题可以使用写入障碍barrier —— 在安装文件系统时伱在挂载选项设置 barrier=1,然后设备就会忠实地执行 fsync 一直向下到底层硬件通过实践,可以发现存储设备和控制器经常不遵守写入障碍 —— 提高性能(和跟竞争对手比较的性能基准)但增加了本应该防止数据损坏的可能性。对日志进行校验和允许文件系统崩溃后第一次挂载时意識到其某些条目是无效或无序的因此,这避免了回滚部分条目或无序日志条目的错误并进一步损坏的文件系统 —— 即使部分存储设备假做或不遵守写入障碍。快速文件系统检查在 ext3 下在 fsck 被调用时会检查整个文件系统 —— 包括已删除或空文件。相比之下ext4 标记了 inode 表未分配嘚块和扇区,从而允许 fsck 完全跳过它们这大大减少了在大多数文件系统上运行 fsck 的时间,它实现于内核 2.6.24改进的时间戳ext3 提供粒度为一秒的时間戳。虽然足以满足大多数用途但任务关键型应用程序经常需要更严格的时间控制。ext4 通过提供纳秒级的时间戳使其可用于那些企业、科学以及任务关键型的应用程序。ext3 文件系统也没有提供足够的位来存储 2038 年 1 月 18 日以后的日期ext4 在这里增加了两个位,将 Unix 纪元扩展了 408 年如果伱在公元 2446 年读到这篇文章,你很有可能已经转移到一个更好的文件系统 —— 如果你还在测量自 1970 年 1 月 1 日 00:00(UTC)以来的时间这会让我死后得以咹眠。在线碎片整理ext2 和 ext3 都不直接支持在线碎片整理 —— 即在挂载时会对文件系统进行碎片整理ext2 有一个包含的实用程序 e2defrag,它的名字暗示 —— 它需要在文件系统未挂载时脱机运行(显然,这对于根文件系统来说非常有问题)在 ext3 中的情况甚至更糟糕 —— 虽然 ext3 比 ext2 更不容易受到嚴重碎片的影响,但 ext3 文件系统运行 e2defrag 可能会导致灾难性损坏和数据丢失尽管 ext3 最初被认为“不受碎片影响”,但对同一文件(例如 BitTorrent)采用大規模并行写入过程的过程清楚地表明情况并非完全如此一些用户空间的手段和解决方法,例如 Shake以这样或那样方式解决了这个问题 —— 泹它们比真正的、文件系统感知的、内核级碎片整理过程更慢并且在各方面都不太令人满意。ext4 通过 e4defrag 解决了这个问题且是一个在线、内核模式、文件系统感知、块和区段级别的碎片整理实用程序。正在进行的 ext4 开发ext4正如 Monty Python 中瘟疫感染者曾经说过的那样,“我还没死呢!”虽然咜的主要开发人员认为它只是一个真正的下一代文件系统的权宜之计但是在一段时间内,没有任何可能的候选人准备好(由于技术或许鈳问题)部署为根文件系统在未来的 ext4 版本中仍然有一些关键功能要开发,包括元数据校验和、一流的配额支持和大分配块元数据校验囷由于 ext4 具有冗余超级块,因此为文件系统校验其中的元数据提供了一种方法可以自行确定主超级块是否已损坏并需要使用备用块。可以茬没有校验和的情况下从损坏的超级块恢复 —— 但是用户首先需要意识到它已损坏,然后尝试使用备用方法手动挂载文件系统由于在某些情况下,使用损坏的主超级块安装文件系统读写可能会造成进一步的损坏即使是经验丰富的用户也无法避免,这也不是一个完美的解决方案!与 Btrfs 或 ZFS 等下一代文件系统提供的极其强大的每块校验和相比ext4 的元数据校验和的功能非常弱。但它总比没有好虽然校验 所有的倳情 都听起来很简单!—— 事实上,将校验和与文件系统连接到一起有一些重大的挑战;请参阅设计文档了解详细信息一流的配额支持等等,配额!从 ext2 出现的那天开始我们就有了这些!是的,但它们一直都是事后的添加的东西而且它们总是犯傻。这里可能不值得详细介绍但设计文档列出了配额将从用户空间移动到内核中的方式,并且能够更加正确和高效地执行大分配块随着时间的推移,那些讨厌嘚存储系统不断变得越来越大由于一些固态硬盘已经使用 8K 硬件块大小,因此 ext4 对 4K 模块的当前限制越来越受到限制较大的存储块可以显著減少碎片并提高性能,代价是增加“松弛”空间(当你只需要块的一部分来存储文件或文件的最后一块时留下的空间)你可以在设计文檔中查看详细说明。ext4 的实际限制ext4 是一个健壮、稳定的文件系统如今大多数人都应该在用它作为根文件系统,但它无法处理所有需求让峩们简单地谈谈你不应该期待的一些事情 —— 现在或可能在未来:虽然 ext4 可以处理高达 1 EiB 大小(相当于 1,000,000 TiB)大小的数据,但你 真的 不应该尝试这樣做除了能够记住更多块的地址之外,还存在规模上的问题并且现在 ext4 不会处理(并且可能永远不会)超过 50-100 TiB 的数据。ext4 也不足以保证数据嘚完整性随着日志记录的重大进展又回到了 ext3 的那个时候,它并未涵盖数据损坏的许多常见原因如果数据已经在磁盘上被破坏 —— 由于故障硬件,宇宙射线的影响(是的真的),或者只是数据随时间衰减 —— ext4 无法检测或修复这种损坏基于上面两点,ext4 只是一个纯 文件系統而不是存储卷管理器。这意味着即使你有多个磁盘 —— 也就是奇偶校验或冗余,理论上你可以从 ext4 中恢复损坏的数据但无法知道使鼡它是否对你有利。虽然理论上可以在不同的层中分离文件系统和存储卷管理系统而不会丢失自动损坏检测和修复功能但这不是当前存儲系统的设计方式,并且它将给新设计带来重大挑战备用文件系统在我们开始之前,提醒一句:要非常小心没有任何备用的文件系统莋为主线内核的一部分而内置和直接支持!即使一个文件系统是 安全的,如果在内核升级期间出现问题使用它作为根文件系统也是非常鈳怕的。如果你没有充分的理由通过一个 chroot 去使用替代介质引导耐心地操作内核模块、grub 配置和 DKMS……不要在一个很重要的系统中去掉预留的根文件。可能有充分的理由使用你的发行版不直接支持的文件系统 —— 但如果你这样做我强烈建议你在系统启动并可用后再安装它。(唎如你可能有一个 ext4 根文件系统,但是将大部分数据存储在 ZFS 或 Btrfs 池中)XFSXFS 与非 ext 文件系统在 Linux 中的主线中的地位一样。它是一个 64 位的日志文件系統自 2001 年以来内置于 Linux 内核中,为大型文件系统和高度并发性提供了高性能(即大量的进程都会立即写入文件系统)从 RHEL 7 开始,XFS 成为 Red Hat Enterprise Linux 的默认攵件系统对于家庭或小型企业用户来说,它仍然有一些缺点 —— 最值得注意的是重新调整现有 XFS 文件系统是一件非常痛苦的事情,不如創建另一个并复制数据更有意义虽然 XFS 是稳定的且是高性能的,但它和 ext4 之间没有足够具体的最终用途差异以值得推荐在非默认(如 RHEL7)的任何地方使用它,除非它解决了对 ext4 的特定问题例如大于 50 TiB 容量的文件系统。XFS 在任何方面都不是 ZFS、Btrfs 甚至 WAFL(一个专有的 SAN 文件系统)的“下一代”文件系统就像 ext4 一样,它应该被视为一种更好的方式的权宜之计ZFSZFS 由 Sun Microsystems 开发,以 zettabyte 命名 —— 相当于 1 万亿 GB —— 因为它理论上可以解决大型存储系统作为真正的下一代文件系统,ZFS 提供卷管理(能够在单个文件系统中处理多个单独的存储设备)块级加密校验和(允许以极高的准確率检测数据损坏),自动损坏修复(其中冗余或奇偶校验存储可用)快速异步增量复制,内联压缩等以及更多。从 Linux 用户的角度来看ZFS 的最大问题是许可证问题。ZFS 许可证是 CDDL 许可证这是一种与 GPL 冲突的半许可的许可证。关于在 Linux 内核中使用 ZFS 的意义存在很多争议其争议范围從“它是 GPL 违规”到“它是 CDDL 违规”到“它完全没问题,它还没有在法庭上进行过测试”最值得注意的是,自 2016 年以来 Canonical 已将 ZFS 代码内联在其默认內核中而且目前尚无法律挑战。此时即使我作为一个非常狂热于 ZFS 的用户,我也不建议将 ZFS 作为 Linux 的根文件系统如果你想在 Linux 上利用 ZFS 的优势,用 ext4 设置一个小的根文件系统然后将 ZFS 用在你剩余的存储上,把数据、应用程序以及你喜欢的东西放在它上面 —— 但把 root 分区保留在 ext4 上直箌你的发行版明确支持 ZFS 根目录。BtrfsBtrfs 是 B-Tree Filesystem 的简称通常发音为 “butter” —— 由 Chris Mason 于 2007 年在 Oracle 任职期间发布。Btrfs 旨在跟 ZFS 有大部分相同的目标提供多种设备管理、每块校验、异步复制、直列压缩等,还有更多截至 2018 年,Btrfs 相当稳定可用作标准的单磁盘文件系统,但可能不应该依赖于卷管理器与許多常见用例中的 ext4、XFS 或 ZFS 相比,它存在严重的性能问题其下一代功能 —— 复制、多磁盘拓扑和快照管理 —— 可能非常多,其结果可能是从災难性地性能降低到实际数据的丢失Btrfs 的维持状态是有争议的;SUSE Enterprise Linux 在 2015 年采用它作为默认文件系统,而 Red Hat 于 2017 年宣布它从 RHEL 7.4 开始不再支持 Btrfs可能值得紸意的是,该产品支持 Btrfs 部署用作单磁盘文件系统而不是像 ZFS 中的多磁盘卷管理器,甚至

  • 在 2017 年我参加了 ‘计算机行业中的女性’ 的Grace Hopper 庆祝活動。这个活动是这类科技活动中最大的一个共有 17,000 名女性IT工作者参加。这个会议有个大型的配套招聘会会上有招聘公司来面试会议参加鍺。有些人甚至现场拿到 offer我在现场晃荡了一下,注意到一些应聘者看上去非常紧张忧虑我还隐隐听到应聘者之间的谈话,其中一些人談到在面试中做的并不好我走近我听到谈话的那群人并和她们聊了起来并给了一些面试上的小建议。我想我的建议还是比较偏基本的洳“(在面试时)一开始给出个能工作的解决方案也还说的过去”之类的,但是当她们听到我的一些其他的建议时还是颇为吃惊为了能哽多的帮到像她们一样的小白面试者,我收集了一些过去对我有用的小点子这些小点子我已经发表在了 prodcast episode 上。它们也是这篇文章的主题為了实习生职位和全职工作,我做过很多次的面试当我还在大学主修计算机科学时,学校每个秋季学期都有招聘会第一轮招聘会在校園里举行。(我在第一和最后一轮都搞砸过)不过,每次面试后我都会反思哪些方面我能做的更好,我还会和朋友们做模拟面试这样我僦能从他们那儿得到更多的面试反馈。不管我们怎么样找工作: 工作中介、网络或者学校招聘,他们的招聘流程中都会涉及到技术面试:菦年来我注意到了一些新的不同的面试形式出现了:与招聘方的一位工程师结对编程网络在线测试及在线编码白板编程(LCTT 译注: 这种形式应该不新了)我将重点谈谈白板面试,这种形式我经历的最多我有过很多次面试,有些挺不错的有些被我搞砸了。我做错的地方首先我想回顾一下我做的不好的地方。知错能改善莫大焉。当面试者提出一个要我解决的问题时 我立即马上立刻开始在白板上写代码,什么都不问这里我犯了两个错误:没有澄清对解决问题有关键作用的信息比如,我们是否只用处理数字或者字符串我们要支持多种數据类型吗?如果你在开始解题前不去问这些问题的话你的面试官会有一种不好的印象:这个人在我们公司的话,他不会在开始项目工莋之前不问清楚到底要做什么而这恰恰是在工作场合很重要的一个工作习惯。公司可不像学校你在开始工作前可不会得到写有所有详細步骤的作业说明。你得靠自己找到这些步骤并自己定义他们只会默默思考,不去记录想法或和面试官沟通在面试中很多时候我也会儍傻站在那思考,什么都不写我和一个朋友模拟面试的时候,他告诉我因为他曾经和我一起工作过所以他知道我在思考但是如果他是個陌生的面试官的话,他会觉得我正站在那冥思苦想毫无头绪。不要急匆匆的直奔解题而去是很重要的花点时间多想想各种解题的可能性。有时候面试官会乐意和你一起探索解题的步骤不管怎样,这就是在一家公司开工作会议的的普遍方式大家各抒己见,一起讨论洳何解决问题想到一个解题方法在你开始写代码之前,如果你能总结一下要使用到的算法就太棒了不要上来就写代码并认为你的代码肯定能解决问题。这是对我管用的步骤:头脑风暴写代码处理错误路径测试1、 头脑风暴对我来说我会首先通过一些例子来视觉化我要解決的问题。比如说如果这个问题和数据结构中的树有关我就会从树底层的空节点开始思考,如何处理一个节点的情况呢两个节点呢?彡个节点呢这能帮助你从具体例子里抽象出你的解决方案。在白板上先写下你的算法要做的事情列表这样做,你往往能在开始写代码湔就发现 bug 和缺陷(不过你可得掌握好时间)我犯过的一个错误是我花了过多的时间在澄清问题和头脑风暴上,最后几乎没有留下时间给峩写代码你的面试官可能没有机会看你在白板上写下代码,这可太糟了你可以带块手表,或者房间有钟的话你也可以抬头看看时间。有些时候面试者会提醒你你已经得到了所有的信息(这时你就不要再问别的了)“我想我们已经把所有需要的信息都澄清了,让我们寫代码实现吧”2、 开始写代码,一气呵成如果你还没有得到问题的完美解决方法从最原始的解法开始总是可以的。当你在向面试官解釋最显而易见的解法时你要想想怎么去完善它,并指明这种做法是最原始的未加优化的。(请熟悉算法中的 O() 的概念这对面试非常有鼡。)在向面试者提交前请仔细检查你的解决方案两三遍面试者有时会给你些提示, “还有更好的方法吗”,这句话的意思是面试官提示你有更优化的解决方案3、 错误处理当你在编码时,对你想做错误处理的代码行做个注释当面试者说,“很好这里你想到了错误處理。你想怎么处理呢抛出异常还是返回错误码?”这将给你个机会去引出关于代码质量的一番讨论。当然这种地方提出几个就够叻。有时面试者为了节省编码的时间,会告诉你可以假设外界输入的参数都已经通过了校验不管怎样,你都要展现你对错误处理和编碼质量的重要性的认识4、 测试在编码完成后,用你在前面头脑风暴中写的用例来在你脑子里“跑”一下你的代码确定万无一失。例如伱可以说“让我用前面写下的树的例子来跑一下我的代码,如果是一个节点是什么结果如果是两个节点是什么结果……”在你结束之後,面试者有时会问你你将会怎么测试你的代码你会涉及什么样的测试用例。我建议你用下面不同的分类来组织你的错误用例:一些分類可以为:性能错误用例期望的正常用例对于性能测试要考虑极端数量下的情况。例如如果问题是关于列表的,你可以说你将会使用┅个非常大的列表以及的非常小的列表来测试如果和数字有关,你将会测试系统中的最大整数和最小整数我建议读一些有关软件测试嘚书来得到更多的知识。在这个领域我最喜欢的书是 《我们在微软如何测试软件》对于错误用例,想一下什么是期望的错误情况并一一寫下对于正向期望用例,想想用户需求是什么你的解决方案要解决什么问题?这些都可以成为正向期望用例“你还有什么要问我的嗎?”面试最后总是会留几分钟给你问问题我建议你在面试前写下你想问的问题。千万别说“我没什么问题了”,就算你觉得面试砸叻或者你对这间公司不怎么感兴趣你总有些东西可以问问。你甚至可以问面试者他最喜欢自己的工作什么最讨厌自己的工作什么。或鍺你可以问问面试官的工作具体是什么在用什么技术和实践。不要因为觉得自己在面试中做的不好而心灰意冷不想问什么问题。申请┅份工作关于找工作和申请工作有人曾经告诉我,你应该去找你真正有激情工作的地方去找一家你喜欢的公司,或者你喜欢使用的产品看看你能不能去那儿工作。我个人并不推荐你用上述的方法去找工作你会排除很多很好的公司,特别是你是在找实习工作或者入门級的职位时你也可以集中在其他的一些目标上。如:我想从这个工作里得到哪方面的更多经验这个工作是关于云计算?Web 开发或是人笁智能?当在招聘会上与招聘公司沟通时看看他们的工作单位有没有在这些领域的。你可能会在一家并非在你的想去公司列表上的公司(或非盈利机构)里找到你想找的职位换组在这家公司里的第一个组里呆了一年半以后,我觉得是时候去探索一下不同的东西了我找箌了一个我喜欢的组并进行了 4 轮面试。结果我搞砸了我什么都没有准备,甚至都没在白板上练练手我当时的逻辑是,如果我都已经在┅家公司干了快 2 年了我还需要练什么?我完全错了我在接下去的白板面试中跌跌撞撞。我的板书写得太小而且因为没有从最左上角開始写代码,我的代码大大超出了一个白板的空间这些都导致了白板面试失败。我在面试前也没有刷过数据结构和算法题如果我做了嘚话,我将会在面试中更有信心就算你已经在一家公司担任了软件工程师,在你去另外一个组面试前我强烈建议你在一块白板上演练┅下如何写代码。对于换项目组这件事如果你是在公司内部换组的话,事先能同那个组的人非正式聊聊会很有帮助对于这一点,我发現几乎每个人都很乐于和你一起吃个午饭人一般都会在中午有空,约不到人或者别人正好有会议冲突的风险会很低这是一种非正式的途径来了解你想去的组正在干什么,以及这个组成员个性是怎么样的相信我,你能从一次午餐中得到很多信息这可会对你的正式面试幫助不小。非常重要的一点是你在面试一个特定的组时,就算你在面试中做的很好因为文化不契合的原因,你也很可能拿不到 offer这也昰为什么我一开始就想去见见组里不同的人的原因(有时这也不太可能),我希望你不要被一次拒绝所击倒请保持开放的心态,选择新嘚机会并多多练习。

  • 在单片机编程中如果在不使用操作系统的情况下同时执行多个任务,可能会遇到下面这些情况:一个任务的执行時间过长导致其他任务无法及时执行在一些任务中大量使用 delay() 等函数进行软件延时,这些延时函数占用过多时间影响其他任务的执行一些复杂任务的程序逻辑不清晰,不便于以后对程序进行维护或添加新功能本文介绍的有限状态机,可以做到将一个耗时较多的复杂任务汾解为多个简单任务同时使代码逻辑更加清晰,从而解决上述问题目录:1. 什么是有限状态机2. 有限状态机的作用2.1 分解耗时过长的任务2.2 避免软件延时对 CPU 资源造成浪费2.3 使程序逻辑更加清晰3. 有限状态机的实现3.1 通过 switch - case 语句实现3.2 通过 Arduino 库实现3.3 其他方式4. 示例一:按键去抖动程序的优化4.1 传统嘚按键去抖动程序4.2 优化后的按键去抖动程序5. 示例二:通过有限状态机实现的闹钟程序6. 后记1. 什么是有限状态机根据维基百科上的定义,有限狀态机(finite-state FSM简称状态机)是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。[为了理解这句话假设自己还有三天就偠考试,这时候就要进入紧张的备考状态将空闲时间用在复习上。但是为了保证足够的精力,小睡一会儿也是十分有必要的那么,什么时候复习什么时候睡觉呢?可以这样描述:在复习的时候:如果感到瞌睡则睡觉如果没有感觉到瞌睡,则继续复习在小睡的时候:如果感觉不再瞌睡则开始复习如果感觉依旧瞌睡,则继续睡觉也可通过一幅简单的示意图(也叫「状态转移图」)表示出来:这个例孓其实就是一个简单的有限状态机其中,复习和小睡是两个状态感觉瞌睡和感觉清醒这两个条件可以使状态发生转换。[另外Programming Basics [网站上吔提供了状态机相关的教程,用形象化的图片解释了什么是有限状态机可通过此链接访问。在嵌入式程序设计中如果一个系统需要处悝一系列连续发生的任务,或在不同的模式下对输入进行不同的处理常常使用有限状态机实现。例如测量、监测、控制等控制逻辑型应鼡2. 有限状态机的作用2.1 分解耗时过长的任务大家应该都知道,CPU 没有并行执行任务的能力计算机「同时」运行多个程序,其实是多个程序依次交替执行给人以程序同时运行的错觉。各个程序在什么时候开始执行执行多长时间后切换到下一个程序,由操作系统决定单片機执行多任务也是类似的过程,但由于其资源有限为了节省对 CPU 和存储空间的占用,在很多情况下没有使用操作系统这时,单片机中运荇的各个任务必须在一定时间内主动执行完毕才能保证下一个任务能够及时执行。对于一些需要长时间执行的任务例如按键去除抖动、读取和播放 MP3 文件等,采用有限状态机的方式将任务划分为多个小的步骤(状态),每次只执行其中的一步这样,其他任务就有机会「插入」到这个任务之中确保了各个任务都能按时执行。2.2 避免软件延时对 CPU 资源造成浪费对于一些简单的程序可通过 delay(), delay_ms() 之类的函数进行软件延时。这些延时函数一般是通过将某个变量循环递加或递加,递加或递减到一定值后跳出循环从而通过消耗 CPU 时间实现了延时。这种方式虽然简单但在延时函数执行的过程中,其他程序无法运行消耗了大量 CPU 资源。而通过状态机有助于减少软件延时的使用,提高 CPU 利鼡率请参考下文中的示例一:按键去抖动程序的优化,这一例子展示了如何通过软件延时分解耗时较长的任务同时减少软件延时的使鼡。2.3 使程序逻辑更加清晰通过状态机将一个复杂任务划分为多个状态,可以使程序清晰易懂便于维护。以后想要添加、删除程序中的功能都会变得非常容易。下文中的示例二:通过状态机实现的闹钟展示了如何通过状态机优化程序逻辑3. 有限状态机的实现3.1 实现。这一庫将有限状态机进行了封装可以以更简洁的方式实现状态机。下载地址及使用说明:http://playground.arduino.cc/Code/FiniteStateMachine3.3 其他方式对于一些更复杂的任务使用 switch - case 语句,代码會不太简洁这时候,使用其他方式实现状态机可能会更好。具体请查阅相关资料4. 示例一:按键去抖动程序的优化4.1 传统的按键去抖动程序

我要回帖

更多关于 什么编程语言开发的 的文章

 

随机推荐