软件工程

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

20
您如何处理项目经理
我目前在一家最近裁员的公司工作。我负责所有内部工作,客户端安装,构建,质量检查,以及基本上所有内部工作。 我的直接上司非常非技术性,最近我发现很难解决他的知识不足。 我遇到的最大问题如下: 我一次有很多截止日期。我停下来整理半个快速报价,因为我不能在截止日期之前迟到,与此同时,出现了三个支持电话,我给报价,报价时间太多,所以他们外包了。然后,我必须修复供应商破坏的所有东西,这使我落伍了。最糟糕的是,如果我在一个我什至没有参与的项目中吃掉了“他的缓冲区”,那么我期望在其他所有事情都出现的同时,完成已经排定的一切。 我被问到问题到来时,为什么会发生问题并进行详细说明,但是这个细节对他来说绝对没有任何意义。 他只关心截止日期,但他是安排一切的人。 “我不是程序员,也不是平面设计师,对他而言毫无意义” 我被聘为.NET程序员,但他们让供应商为许多站点选择了wordpress(是的,我必须快速学习所有内容) 我想我可以继续下去,但是有人必须与这种类型的项目经理打交道吗?除了找工作以外,还有什么建议? 我的妻子现在病重,我现在不能丢掉保险,因为我现在不能失去保险。 我正在寻找与经理打交道的最佳方法。 在此先感谢您,我将其作为Wiki,因此请不要关闭。 这是今天发生的另一种情况。我们有一个朋友帮助我进行项目。他要求我们“两个”都引用一份工作,并给出一个粗略的估计。我回到他身边说:“一天7个星期,每天6个小时,用我的朋友作为资源。” 他将其交给客户并添加了10%的缓冲区(24小时)。然后他告诉我,这就是我在该项目上得到我朋友的全部。没问我这七个星期有多少时间。最糟糕的是,他们已经把报价交给了客户,甚至没有让我审查。他的观点很不错,您可以在我告诉他的时候就完成工作,或者找到另一份工作。

3
不带参数不返回任何值的函数的名称是什么?[关闭]
在Java 8的java.util.function程序包中,我们有: 功能:接受一个参数,产生一个结果。 消费者:采取一种论点,什么都不做。 供应商:不带任何争议,得出一个结果。 ...:其他处理原语,2个参数等的情况... 但是我需要处理“ 不带参数,不产生任何东西 ”的情况。 在中没有任何内容java.util.functionnal。 因此,问题是: “ 不带参数不返回任何值的函数 ”的名称是什么? 在Java 8中,其定义为: @FunctionalInterface public interface InsertANameHere { void execute(); } 执行程序已经存在并具有另一个用途:“ 一个对象,该对象执行已提交的可运行任务 ”。签名不匹配(execute(Runnable):void),甚至都不是一个功能接口。 Runnable存在,但它与线程上下文紧密关联: 这个包java.lang不是java.util.function。 javadoc指出:“ Runnable接口应该由实例打算由线程执行的任何类实现 ”。 名称“ Runnable”建议在线程内运行一些代码。

7
我应该使用哪个HTTP动词来触发REST Web服务中的操作?
我正在实现RESTful Web服务,可用的操作之一将是reload。它将用于重新加载配置,缓存等。 我们从一个简单GET的URI 开始,如下所示:(${path}/cache/reload不传递任何参数,仅调用URI)。我知道不应使用GET请求修改数据。 在RESTful Web服务中用来调用动作/命令的正确动词是什么? 重新加载是REST Web服务的命令,该命令重新加载自己的缓存/配置/等。它不是将信息返回给客户端的方法。 我想做的可能不是REST,但这仍然需要通过这种方式来完成。该reload方法只是一个真实的示例,在应用程序范围内有意义,并且大多数答案都针对该示例,但是实际上,我只需要知道哪个动词即可触发不执行CRUD的操作,但仍会更改数据/州。 我在以下主题的Stack Overflow上找到了这个详细的答案:https ://stackoverflow.com/questions/16877968/
80 rest  rpc 

7
微服务最被接受的交易策略是什么
我所看到的在具有微服务的系统中发生的主要问题之一是,事务跨不同服务时的工作方式。在我们自己的体系结构中,我们一直在使用分布式事务来解决此问题,但是它们带有各自的问题。迄今为止,僵局尤其令人痛苦。 另一个选择似乎是某种定制的事务管理器,它知道您系统内的流程,并会为您处理回滚,因为它是跨整个系统的后台进程(因此它将告诉其他服务回滚)如果它们出现故障,请稍后通知他们)。 还有其他可接受的选择吗?两者似乎都有其缺点。第一个可能导致死锁和许多其他问题,第二个可能导致数据不一致。有更好的选择吗?


8
在不进行广泛模拟的情况下,应该如何编写单元测试?
据我了解,单元测试的重点是隔离测试代码单元。这意味着: 它们不应被代码库中其他地方不相关的代码更改破坏。 与集成测试相反(集成测试可能会中断),只有一个单元测试应该通过被测试单元中的错误来破坏。 所有这些暗示着,应该模拟掉测试单元的所有外部依赖关系。我的意思是所有外部依赖关系,而不仅仅是网络,文件系统,数据库等“外部层”。 这得出一个合理的结论,几乎每个单元测试都需要模拟。另一方面,谷歌对嘲笑的快速搜索显示了成千上万的文章声称“嘲笑是一种代码味道”,应该(尽管不完全)避免。 现在,到问题。 单元测试应如何正确编写? 它们和集成测试之间的界线到底在哪里? 更新1 请考虑以下伪代码: class Person { constructor(calculator) {} calculate(a, b) { const sum = this.calculator.add(a, b); // do some other stuff with the `sum` } } 可以在Person.calculate不模拟Calculator依赖关系的情况下测试该方法的测试(假定,它Calculator是不访问“外部世界”的轻量级类)可以视为单元测试吗?


8
为什么使用尾随换行符而不使用printf开头?
我听说您在使用时应避免使用换行符printf。因此,而不是printf("\nHello World!")你应该使用printf("Hello World!\n") 在上面的特定示例中,这没有意义,因为输出将有所不同,但请考虑以下事项: printf("Initializing"); init(); printf("\nProcessing"); process_data(); printf("\nExiting"); 相比: printf("Initializing\n"); init(); printf("Processing\n"); process_data(); printf("Exiting"); 我觉得尾随换行符没有任何好处,除了看起来更好。还有其他原因吗? 编辑: 我现在就在这里进行点票表决。我不认为这属于堆栈溢出,因为这个问题主要与设计有关。我也要说,尽管对此事可能有意见,但Kilian Foth的回答和cmaster的回答证明了一种方法的确确实有非常客观的好处。
79 c 

6
垃圾回收如何以本地编译的语言工作?
浏览了堆栈溢出的几个答案之后,很明显,一些本机编译的语言具有垃圾回收功能。但是我不清楚这将如何工作。 我了解垃圾收集如何与解释语言一起工作。垃圾收集器将仅与解释器一起运行,并从程序的内存中删除未使用和无法访问的对象。他们俩一起跑。 但是,如何使用编译语言呢?我的理解是,一旦编译器将源代码编译为目标代码(特别是本机代码),就完成了。它的工作完成了。那么,编译后的程序又如何被垃圾回收呢? 在执行程序删除“垃圾”对象时,编译器是否以某种方式与CPU一起工作?还是编译器在编译程序的可执行文件中包括一些最小的垃圾回收器。 我相信我的后一种说法将比前一种更具有效性,这是由于从Stack Overflow的答案中摘录的: 一种这样的编程语言是埃菲尔。大多数Eiffel编译器出于可移植性原因而生成C代码。该C代码用于通过标准C编译器生成机器代码。埃菲尔实现为该已编译的代码提供GC(有时甚至是精确的GC),并且不需要VM。特别是,VisualEiffel编译器直接在完全GC支持下生成了本机x86机器代码。 最后一条语句似乎暗示编译器在最终的可执行文件中包含一些程序,该程序在运行时充当垃圾回收器。 在页面d语言的关于垃圾收集的网站这是本地编译并具有可选的垃圾收集器- -似乎也暗示了一些后台程序运行沿着原来的可执行程序来实现垃圾回收。 D是一种支持垃圾回收的系统编程语言。通常,没有必要显式释放内存。只需根据需要进行分配,垃圾收集器就会定期将所有未使用的内存返回到可用内存池。 如果方法上面提到的被使用,究竟会工作的呢?编译器是否存储一些垃圾回收程序的副本并将其粘贴到它生成的每个可执行文件中? 还是我的思维有缺陷?如果是这样,使用什么方法来实现编译语言的垃圾回收,它们将如何工作?


3
我如何摆脱“循环”思想流派?
这是一个相当概念性的问题,但是我希望我能对此得到一些好的建议。我做的很多编程工作都是使用(NumPy)数组。我经常必须匹配大小不同的两个或多个数组中的项,而我要去的第一件事是一个for循环,甚至更糟的是嵌套的for循环。我想尽可能避免for循环,因为它们很慢(至少在Python中如此)。 我知道NumPy的很多功能都需要我研究一些预定义的命令,但是当您必须迭代某些内容时,您(作为经验丰富的程序员)是否会想到一个一般的思考过程? 所以我经常有这样的事情,这很糟糕,我想避免它: small_array = np.array(["one", "two"]) big_array = np.array(["one", "two", "three", "one"]) for i in range(len(small_array)): for p in range(len(big_array)): if small_array[i] == big_array[p]: print "This item is matched: ", small_array[i] 我知道有多种方法可以实现这一目标,但是我对通用的思维方法(如果存在)感兴趣。
79 python  array  loops 

6
单引号与双引号[关闭]
我刚从Java背景开始从事Python的工作,并且注意到其他开发人员倾向于使用单引号('')而不是双引号("")来引用字符串。例如: line1 = 'This is how strings typically look.' line2 = "Not like this." 除了个人喜好之外,还有其他特殊原因吗?这是引用字符串的正确方法吗?具体来说,我想知道的是,是否存在某种类型的标准或公认的最佳实践来推动这种编码方式。


2
是否有实际上适用于Java的OO原理?
Javascript是一种基于原型的面向对象语言,但是可以通过以下多种方式变为基于类的语言: 自己编写要用作类的函数 在框架中使用漂亮的类系统(例如mootools Class.Class) 从Coffeescript生成 一开始,我倾向于使用Javascript编写基于类的代码,并高度依赖它。但是最近我一直在使用Javascript框架和NodeJS,它们脱离了类的概念,而更多地依赖于代码的动态特性,例如: 异步编程,使用和编写使用回调/事件的编写代码 使用RequireJS加载模块(以便它们不会泄漏到全局名称空间) 功能编程概念,例如列表推导(映射,过滤器等) 除其他事项外 到目前为止,我所收集的是,我已阅读的大多数OO原理和模式(例如SOLID和GoF模式)都是为基于类的OO语言(例如Smalltalk和C ++)编写的。但是其中有哪些适用于基于原型的语言(例如Javascript)? 是否有特定于Java的原则或模式?避免回调地狱,邪恶的eval或任何其他反模式的原则。

12
为什么最近转向从Java脚本中删除/省略分号?
最近,从Java语言中省略分号似乎很流行。几年前有一篇博客文章强调,在Javascript中,分号是可选的,并且文章的主旨似乎是您不必理会它们,因为它们是不必要的。该帖子被广泛引用,并没有给出任何令人信服的理由不使用它们,只是将它们排除在外几乎没有副作用。 甚至GitHub都跳上了无分号的潮流,要求它们省略任何内部开发的代码,并且其维护者最近对zepto.js项目的承诺已从代码库中删除了所有分号。他的主要论据是: 这是他团队的优先事项; 打字少 还有其他好的理由将其排除在外吗? 坦白说,我看不出没有理由忽略它们,当然也没有理由回过头来删除它们。这也违背了(多年的)推荐做法,我并不真的赞成“货运崇拜”的说法。那么,为什么最近都讨厌分号?短缺迫在眉睫吗?还是这只是最新的Javascript时尚?

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.