软件工程

针对在系统开发生命周期中工作的专业人士,学者和学生的问答

21
客户希望我录制有关如何开发他的软件产品的视频
作为自由职业者,我经常看到客户提出奇怪的要求,其中一些可能会对我的日常工作产生负面影响¹,而另一些则试图设置某种控制权。我通常会在初步谈判中遇到这些问题,因此在这种状态下很容易向客户说明我确实关心自己的工作和生产力,并希望客户信任我的工作。 我刚刚接受的项目的工作要困难得多²,因为这是在谈判结束之后(合同已经签订,没有提及视频跟踪),并且在我开始从事该项目后,客户要求我记录在他的项目上工作时我在机器上所做的所有操作的视频,即将显示我移动光标,键入字符,打开文件,移动窗口等的视频。 我使用自己的PC在自己的公司工作。 我向该客户回答说,由于以下原因,该请求无法接受: 在双屏PC上数百小时的工作将需要大量磁盘空间来存储录制的视频。如果我不在乎空间,那么我会在乎这个客户浪费我的带宽来下载那些视频。 录制视频会影响整体性能并降低我的工作效率(实际上并非如此,因为该机器功能强大,足以录制此视频而不会造成性能损失,但是,看起来仍然是有效的论据)。 我不总是记得在开始工作之前打开视频记录,然后在结束时关闭它。 这可能是隐私问题。如果在录制视频时切换到邮件怎么办?如果要打开包含有关此客户项目文件的目录,该如何打开包含所有客户列表的父目录,该怎么办? 这样的视频不能成为一个可靠的消息来源,以跟踪项目(我按小时收费)的成本,因为有些工作只用铅笔和纸(这做是真正正确的,因为我做很多工作草案没有使用PC)。 尽管有这些要点,客户还是认为如果我不想录制视频,那是因为我有一些隐藏的东西,并且想知道他在项目上花费的实时时间³。 如何向他解释,自由职业者录制日常工作的视频不是通常的作法,而这种奢侈的要求必须留给特殊情况⁴? ¹最常见的示例是要求通过速度超过Internet速度较慢的速度较慢的服务器上的Remote Desktop进行工作,或者被迫在没有严重理由的情况下将过时的软件用作Windows Me支持。 ²实际上,我已经做了很多与管理和系统设计相关的工作,这是必不可少的,但通常会被客户误解,并浪费时间和金钱。观察相关客户,我非常确定他将拒绝为已经完成的工作支付大量资金,因为实际上代码行为零。即使从法律上来说,我可以轻松地证明在设计级别上还有很多工作要做,但我也不想在法庭上终止与该客户的关系。 ³由于我将这个项目的预期成本和最大成本交给了该客户,因此风险不那么大,因此,即使是客户,也绝不会被要求支付超过合同规定的最大金额的款项。如果实际工作花费更多。 I当我有效地主动记录操作视频时,就是必须直接在客户的生产服务器上进行一些操作,特别是在涉及安全问题时。记录这些步骤可能是一个好主意,以准确地了解已完成的操作,并确保我的工作中没有错误,或查看这些错误是什么。 更新: 首先,感谢您的所有回答和评论。 由于这个问题比我预期的吸引了更多的注意力并且得到了更多的答案,因此我认为它可能与其他人相关,因此我添加了一个更新。首先,为了总结答案和评论,建议(随机排列): 建议其他跟踪方式,如Twitter Code Swarm视频中所示,或提供“具有简单,清晰可交付成果的简短里程碑,然后是更复杂的里程碑”,等等。 说明该视频不是可靠的资源,可以被伪造,并且很难实施,尤其是在支持方面。 说明该视频不是可靠的信息源,因为它仅显示了一部分工作:无需使用计算机即可完成大量工作,还不包括考虑解决问题所花费的额外时间。 遵守合同;如果客户想要更改它,则他必须期待新的谈判和更高的价格。 录制视频,“但要求客户将全部费用存入托管账户”,要求律师录制所有可计费时间等录像带,换句话说,“在没有信任的环境中工作”,要求客户负担额外费用。 搜索禁止这样做的法律。几个人问我住在哪个国家。我在法国。此类法律的存在是为了保护公司的员工(对于安全摄像机等有严格的规定,但是我敢肯定,任何事情都不能禁止自由职业者自觉签订合同,强迫他在从事项目工作时录制屏幕。 只需发送视频即可:客户将“观看几十秒钟他不理解的活动摘要”,然后将这些视频扔掉。 说不。毕竟,这是我的工作,而且我是唯一决定如何进行业务的人。另外,合同已经签订,与视频跟踪无关。 说不。我在公司中采用的流程和实践可以被视为商业秘密,并且可以分类。 放弃。如果这种关系开始的话,很可能不久或以后就会严重终止。另外,“如果他像小偷一样对待您-那就是他的建议-那么当XYZ功能无法完全按照他的预期工作时,情况只会变得更糟”。 尽管所有这些建议都同样有价值,但我个人选择对客户说我接受制作视频,但是在这种情况下,我们必须重新协商合同,同时要记住,这会产生相当大的成本,包括版权发布的额外费用。新的总成本平均为项目实际成本的三倍。认识这个客户,我完全可以确定他绝不会接受这么多钱,所以问题就解决了。 第二次更新: 考虑到大量的额外费用,客户实际上拒绝了重新谈判原始合同的提议。

20
是否应将UTF-16视为有害的?
我要问的是一个有争议的问题:“是否应该将最流行的编码之一UTF-16视为有害?” 我为什么要问这个问题? 有多少程序员知道UTF-16实际上是可变长度编码的事实?我的意思是,有些代码点以代理对的形式表示,并包含多个元素。 我知道; 许多应用程序,框架和API使用UTF-16,例如Java的String,C#的String,Win32 API,Qt GUI库,ICU Unicode库等。但是,所有这些都在处理中存在许多基本的错误。 BMP中的字符数(应使用两个UTF-16元素编码的字符)。 例如,尝试编辑以下字符之一: 𝄞(U + 1D11E)音乐符号G CLEF 𝕥(U + 1D565)数学双打击小T 𝟶(U + 1D7F6)数学单点数字零 U(U + 2008A)汉字 您可能会错过一些字体,具体取决于您安装的字体。这些字符都在BMP(基本多语言平面)之外。如果看不到这些字符,也可以尝试在Unicode字符参考​​中查看它们。 例如,尝试在Windows中创建包含这些字符的文件名。尝试使用“退格键”删除这些字符,以查看它们在使用UTF-16的不同应用程序中的行为。我做了一些测试,结果很糟糕: Opera在编辑它们时遇到问题(在退格键上需要按2下删除) 记事本无法正确处理它们(删除需要按两次退格键) 在“窗口”对话框中编辑的文件名已损坏(需要删除,请按两次退格键) 所有QT3应用程序都不能处理它们-显示两个空的正方形而不是一个符号。 u'X'!=unicode('X','utf-16')当X在BMP之外的字符直接在某些平台上使用时,Python会错误地编码此类字符。 当Python用UTF-16 Unicode字符串编译时,Python 2.5 unicodedata无法获得此类字符的属性。 如果直接将它们作为Unicode字符进行编辑,则StackOverflow似乎从文本中删除了这些字符(这些字符使用HTML Unicode转义符显示)。 当受MaxLength限制时,WinForms TextBox可能会生成无效的字符串。 在使用UTF-16的许多应用程序中,此类错误似乎非常容易找到。 那么...您认为UTF-16应该被认为有害吗?
432 unicode 

30
我是经理 如何改善工作关系和与程序员的沟通?[关闭]
首先有一点背景。我是中型公司的项目经理。我刚从CS专业开始,对编程有点儿接触,但是几个月后,我知道这不是我的路,所以我转向管理。事实证明,这是个不错的决定,毕业后,我在多家公司从事软件管理工作(至今已有5年)。 最近,我们有一个非常痛苦的项目。这是最坏的情况,最糟糕的是,在我们这方面和在客户方面都存在很多错误,并且几乎没有损失就结束了。这导致了许多令人沮丧的情况,其中一种情况升级到了我们的一位高级开发人员在与我们(管理层)进行口头辩论之后离开公司的地步。这对我来说是个危险的信号:我做错了什么。(根据记录,争论是关于几个错误的时间估计) 我在许多地方搜索了答案,一个朋友向我指出了该站点。这里有很多关于管理挫折的问题。我可以理解,普遍的不良经历导致人们普遍不愿“穿着西装的家伙”。 我就是穿西装的那个人。它可能看起来并不像,但是我想要的只是一个成功的项目,而由于资源有限,它需要做出艰难的决定。那是我的工作。前述高级开发人员抱怨的事情之一是工作设备。坦白说,我不知道我们的计算机不适合工作。之后,我问了很多程序员,并且普遍的共识是我们需要更好的机器。从那时起我就解决了这个问题,但是我和程序员之间显然存在巨大的沟通差距。一些最杰出的开发人员是最害羞,最沉默的人。我知道,在面试过程中从来没有问题。人是不同的,并且在不同领域具有优势。 动力不足的PC只是众多使我认为存在通信问题的案例之一。如何在不令人畏惧和重复的情况下改善与程序员的沟通? 我希望人们不要抱怨美好的事物。如果您喜欢您的工作场所并喜欢(或至少喜欢:))您的经理,请告诉我有关他们的信息。他们在做什么对吗?同样,如果您讨厌它,请详细说明原因。我正在寻找有关改善沟通的答案,因为我认为这是我的问题,但我可能错了。
431 management 

30
如何创建自己的编程语言和用于它的编译器[关闭]
我对编程很了解,并且遇到过各种语言,包括BASIC,FORTRAN,COBOL,LISP,LOGO,Java,C ++,C,MATLAB,Mathematica,Python,Ruby,Perl,JavaScript,Assembly等。我不明白人们是如何创建编程语言并为其设计编译器的。我也无法理解人们如何创建Windows,Mac,UNIX,DOS等操作系统。对我来说,另一件事是神秘的,人们如何创建像OpenGL,Op​​enCL,OpenCV,Cocoa,MFC等之类的库。我无法弄清的最后一件事是科学家如何设计微处理器的汇编语言和汇编器。我真的很想学习所有这些知识,而且我今年15岁。我一直想成为计算机科学家,例如Babbage,Turing,Shannon或Dennis Ritchie。 我已经读过Aho的Compiler Design和Tanenbaum的OS概念书,他们都只在高层次上讨论概念和代码。它们不涉及细节和细微差别,也不涉及如何设计编译器或操作系统。我需要一种具体的理解,以便我自己创建一个,而不仅仅是对线程,信号量,进程或解析的理解。我问我兄弟这一切。他是麻省理工学院EECS的SB学生,对如何在现实世界中实际创建所有这些东西一无所知。他所知道的只是对编译器设计和OS概念的理解,就像你们提到的(即线程,同步,并发,内存管理,词法分析,中间代码生成等)一样。

12
在生产中发现错误时,我是否应该有意中断构建?
在我看来,如果最终用户在生产中发现了严重的错误,应该添加一个失败的单元测试来覆盖该错误,从而有意破坏该构建,直到修复该错误为止。我这样做的理由是构建应该一直失败,但这并不是由于自动测试覆盖率不足所致。 我的几个同事不同意说不应该检查失败的单元测试。就正常的TDD惯例而言,我同意这种观点,但是我认为应该以不同的方式处理生产错误-毕竟,为什么要允许建立已知缺陷的成功方案? 是否有其他人具有处理这种情况的可靠策略?我知道故意破坏构建可能会对其他团队成员造成破坏,但这完全取决于您使用分支机构的方式。
410 unit-testing  tdd  builds 

12
“业务逻辑应该在服务中而不在模型中”的准确性如何?
情况 今天晚上早些时候,我回答了关于StackOverflow的问题。 问题: 现有对象的编辑应该在存储层还是在服务中进行? 例如,如果我有一个负债的用户。我想改变他的债务。我应该通过获取对象,对其进行编辑并保存来在UserRepository或服务(例如BuyingService)中进行操作吗? 我的答案: 您应该将将一个对象变异为相同的对象,并使用存储库来检索该对象。 情况示例: class User { private int debt; // debt in cents private string name; // getters public void makePayment(int cents){ debt -= cents; } } class UserRepository { public User GetUserByName(string name){ // Get appropriate user from database } } 我收到的评论: 业务逻辑实际上应该在服务中。不在模型中。 互联网怎么说? …


15
在一个单元测试中可以有多个断言吗?
在对此出色文章的评论中,Roy Osherove提到了OAPT项目,该项目旨在在单个测试中运行每个断言。 以下内容写在项目的主页上: 正确的单元测试应该仅出于一个原因而失败,这就是为什么您应该在每个单元测试中使用一个断言。 而且,罗伊(Roy)在评论中写道: 我的指导原则通常是每次测试都测试一个逻辑概念。您可以在同一对象上具有多个断言 。它们通常是要测试的相同概念。 我认为在某些情况下需要多个断言(例如Guard Assertion),但总的来说,我尝试避免这种情况。你有什么意见?请提供一个真实的示例,其中确实需要多个断言。
396 unit-testing 

30
为什么Java不用于现代Web应用程序开发?[关闭]
作为专业的Java程序员,我一直在试图理解-为什么现代Web应用程序讨厌Java? 我注意到一种趋势,在当今的网络初创企业中,相对较小的比例似乎正在使用Java(与Java的整体普及率相比)。当我问了一些有关此问题的信息时,通常会收到诸如“我满怀热情地讨厌Java”之类的回复。但是似乎没有人真的能够给出明确的答案。 我也听说过,同一网络启动社区对Java开发人员的评价是负面的-或多或少地暗示他们很慢,没有创造力。 结果,我花了一些时间来学习Ruby / Rails,基本上是要找出我所缺少的东西。但是我忍不住想自己:“如果使用Java,我可以更快地完成此工作”,这主要是由于我的相对经验水平。 但这也是因为我没有看到Java遇到任何严重的“遗漏”,因此无法构建相同的应用程序。 这使我想到了一个问题: 为什么在现代Web应用程序中不使用Java? 这是语言的弱点吗? 这是Java的一种不公正的刻板印象吗,因为它已经存在了很长时间(它与较早的技术存在不公平的联系,并且没有因为其“现代”功能而获得认可)? Java开发人员的负面刻板印象是否太强了?(Java不再是“酷”了) 用其他语言编写的应用程序真的可以更快地构建,更容易维护并且性能更好吗? Java是否仅由太慢而无法适应新语言的大公司使用?

29
我不会在业余时间编程。那会让我成为一个不好的开发者吗?
网络上的许多博客和建议似乎都暗示,要成为一名出色的开发人员,仅做日常工作是不够的。例如,您应该在业余时间为开放源代码项目做出贡献,编写智能手机应用程序等。实际上,很多建议似乎表明,如果您不喜欢整日编写程序,那么您会可能是在错误的职业中。 这对我来说并不正确。我很喜欢我的工作,但是当我从办公室回到家时,我并没有心情直接跳回计算机并开始编码,直到就寝为止。我每天只有几个小时的空闲时间,我宁愿将它们花在其他爱好,见朋友或出门旅行上,而不是在电脑前。 我确实从编程中受益匪浅,偶尔会在工作之外闲逛。我致力于个人发展,并花时间阅读技术博客和书籍,以保持学习和不断进步。但这并没有延伸到我想用我所有的业余时间进行编码。 这是否意味着我不是一个真正的“真正”软件开发人员?不用做额外的工作就能成为一名优秀的软件开发人员吗?我很想听听您的想法。 更新:谢谢大家的评论和回答。很多好的想法和建议!

28
我正在进行90%的维护和10%的开发,这正常吗?[关闭]
我刚刚开始我的职业生涯,当时是一家中型公司的Web开发人员。一开始,我就完成了扩展现有应用程序的任务(多年来,由多个程序员开发的编码不佳的代码以不同的方式(零结构)处理相同的任务)。 因此,在我成功地使用所需功能扩展了该应用程序之后,他们给了我任务,以完全维护该应用程序。这当然不是问题,或者我想。但是后来我得知我被禁止改进现有代码,并且只在报告错误时才专注于错误修复。 从那时起,我像上面一样,又有三个项目,现在也要维护。我有四个项目,可以从头开始创建应用程序,我也必须维护它们。 目前,对于要维护的每个应用程序,用户(阅读管理员)的日常邮件使我略为发疯。他们希望我直接处理这些邮件,同时还要处理其他两个新项目(在那之后已经有五个项目在排队)。可悲的是,我尚未收到关于自己编写的任何内容的错误报告。为此,我只是偶尔收到了让我们做180度不同的变更请求。 反正这正常吗?我认为我所做的工作相当于整个开发人员团队。 当我最初希望情况有所不同时,我是白痴吗? 我想这篇文章已经变成了大声疾呼,但是请告诉我,对于每个开发人员来说,情况都不一样。 PS我的薪水几乎相等,甚至不低于超市的收银员的薪水。
368 maintenance 

6
什么是负码?
我正在阅读有关道格拉斯·麦克罗伊(Douglas McIlroy)的维基百科文章,并找到了引述 “编程的真正英雄是编写否定代码的人。” 这意味着什么?

19
您如何知道您是否编写了可读且易于维护的代码?
如何知道一个人创建的代码是否易于阅读,理解和维护?当然,从作者的角度来看,该代码具有可读性和可维护性,因为从一开始,作者就对其进行了编写和编辑。但是,必须有一个客观且可量化的标准,我们的行业可以据此衡量代码。 如果在没有原始作者的专业建议的情况下对代码执行以下操作,则可以达到这些目标: 可以阅读代码并从根本上理解逻辑流程。 可以更深入地了解代码在做什么以包括输入,输出和算法。 其他开发人员可以对原始代码进行有意义的更改,例如错误修复或重构。 可以编写新代码,例如利用原始代码的类或模块。 我们如何量化或衡量代码质量,使我们知道代码的可读性,可理解性和可维护性?

20
在即将走向失败的项目中,我应该如何表现为开发人员?
我是一个由5人组成的团队的开发人员,我相信我们的项目将要走向灾难。我稍后将描述原因,但我的问题是:我应该如何表现? 截止日期为1.5个月,我觉得无论我们做什么,这个项目都会失败。我认为我们应该只是终止项目并停止浪费我们的时间,但是从政治上我认为我们的经理不可能做到这一点。 在这种情况下我该怎么办?我应该付出额外的努力,还是应该轻松些?我该对经理说些什么? 该项目失败的原因: 随着截止日期的临近,许多必备功能尚未完成 应用程序不稳定且很难使用 系统非常复杂,代码很难理解,很难更改-数据模型太受复杂的关系数据库(100多个表)驱动 领导不清;经理对新信息做出重大更改 几乎没有自动化测试或单元测试 严重依赖于其他系统,但尚未进行集成测试 实际上,我们实际上是在1-2个月前从同一个经理下的另一个开发团队继承了这个项目(以及混乱),该团队已经工作了几个月。

30
4-5年是编程职业的“中年危机”吗?
我从事专业C#编程已有4年了。在过去的4年中,我曾为多家中小型公司工作,包括“网络/广告代理商”,小型行业特定的软件商店到小型创业公司。我主要从事“业务应用程序”,涉及使用高级编程语言(收集的垃圾),而我的总体经验是,我所做的所有工作本来可以更加专业。很多事情做错了(仓促),主要是由于成本因素,人们总是想要“现在”的东西,而可动用的钱却最少。我一直在想,也许我可以在更大的公司或更适合程序员的公司工作,或者在某个地方工作?我有足够的金钱和时间来真正地建立一些更长期,更可维护的东西,我可能会在自己的职业生涯中享受更多。我从来没有一个“导师”来指导我度过四年的职业生涯。除了我的学士学位,我几乎是博客/谷歌/自学程序员。 我还观察到另一个问题,在“我的工作环境”中,大多数所谓的“高级”程序员实际上并不是那种高级技能。他们之所以成为“高级”,是因为他们已经有很长时间的程序员了,但是他们编写的代码或做出的决定绝对是垃圾!他们不想学习,他们不想变得更好,他们只是想得到报酬,做他们告诉别人要做的有意义的事情,而我们大多数人就是这样。也许这就是为什么他们现在就在这里。但是我不想变得像他们一样,我想变得更好。我已经陷入一种精神状态,我不再打算成为未来职业的程序员。我开始认为也许还有更好的事情要做。我阅读的博客越多,尝试过的“最佳实践”就越多,我感觉自己正偏离“我的现实”。但是我不是一个优秀的程序员,否则我不认为我现在在这里。我认为4-5年是一个阶段,既可以迈向职业生涯的明智之举,也可以迈出您的目标。 我只是想听听别人对我上面提到的内容有何评论,以及您在过去的编程生涯中是否遇到过类似的情况以及如何处理。谢谢。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.