本文将带您了解关于32条关于软件开发的建议和教训的新内容,同时我们还将为您解释32条关于软件开发的建议和教训怎么写的相关知识,另外,我们还将为您提供关于10条关于2018年软件开发的预测,不仅仅是区块
本文将带您了解关于32 条关于软件开发的建议和教训的新内容,同时我们还将为您解释32 条关于软件开发的建议和教训怎么写的相关知识,另外,我们还将为您提供关于10 条关于 2018 年软件开发的预测,不仅仅是区块链……、CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享、Go语言实现跨平台开发的经验和教训总结、GrimoireLab —— 用于软件开发分析的工具集的实用信息。
本文目录一览:- 32 条关于软件开发的建议和教训(32 条关于软件开发的建议和教训怎么写)
- 10 条关于 2018 年软件开发的预测,不仅仅是区块链……
- CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享
- Go语言实现跨平台开发的经验和教训总结
- GrimoireLab —— 用于软件开发分析的工具集
32 条关于软件开发的建议和教训(32 条关于软件开发的建议和教训怎么写)
近几年来,我一直为大大小小的客户开发专业软件。这些软件中有一些是在非常严格的环境下使用的,安全性和可靠性是最重要的。基于多年的工作经验,我提出了一系列有用的建议和教训。以下是我整理的清单,包括建议、经验教训和最佳实践。
有时候编写一些垃圾代码也没问题。应用程序的各个部分并不是生来平等的。
不必通过学习一门新语言来学习新事物。很多相同的事情可以用多种语言来完成,宁可深而不广。
编写抛弃型代码以测试不同的方法。别把这些抛弃型代码变成产品代码。
防御式编程。你是否记得你认为永远不会变空的那个方法参数?是啊,结果它还是变成了空值,你的应用程序“爆炸”了。只需写下这些卫语句(guard clauses)就可以了。
从来没有,永远也不会有应用程序的硬编码设置。写出可配置组件并向其传递环境变量。重启应用程序比重新编译和部署都要简单。
编写容易测试的代码。这就是说,停止在命令处理程序、服务等中“新建”数据库对象。取而代之的是,使其成为依赖项。
异常只会在特殊情况发生时抛出。
了解 If-Else 的合适替代方法。If-Else 经常被滥用,成为糟糕设计的早期标志。If-Else 语句在许多设计模式中是不必要的。
并非每一个 IF 都需要 Else If 或 Else。If 本身是可以的,并且经常受到鼓励。
重构意味着重构。进行重构时,不要尝试添加任何新功能。这样做没有什么好处。
如果发现了垃圾代码,请花时间清理它,使之更好——无论“更好”在特定环境中是什么意思。
假如不学习设计模式,将会遇到一些困难。它们无处不在,了解它们会使你的生活更轻松。
应用设计模式可以改善代码。
攻击别人的代码并不会让你成为一个更好的程序员,也不会展示你的资历。大多数新手都会攻击其他开发者的代码,因为他们甚至难以理解简单的概念。
在需要接口之前不要创建接口。由具体的类开始完全没有问题。
你是否确定该字段 / 属性 / 方法需要公开?没有,我也这么认为,将其设为私有或者内部。
一个超简单的类,就像一个简单的方法,它是可行的。
针对简单问题编写简单代码。
请确保测试了重构的每一部分。不然你就不知道你在破坏什么。
不 —— 你刚刚草草记下的代码并不比下载量为 1100 万的 npm/nuget/pip 包好。下载那个该死的软件包,并继续前进。
对于复杂的问题,不要害怕提出复杂的解决办法。别走另外一条路。
掌握几种语言就可以了。尝试学习一种后台、前端和数据库语言。通过这种方式,你可以更好地理解团队中其他人所处理的问题。
别再看这些该死的教程了。独立思考一下。当你陷入困境,或者需要快速学习一些东西的时候,偶尔有一些教程是很好的。只是要退出教程的“灵薄狱”。
其他大部分的开发者也会编写垃圾代码。别为此而丧失信心。他们这么做一定有原因。
观看开发者会议的讲座,并关注思想领袖。有很多很好的经验可以借鉴,而且很容易得到启发。
在成为更好的开发者的过程中,我们都会遇到瓶颈。向有成就的开发者寻求建议。不要害怕给一个随机的开发者发送消息。
以 GUID/UUID 作为实体 ID,这使得处理起来更加简单。但是,请注意你的取舍。
遵守 SOLID 原则。它们易于理解,并且可以改进代码质量。诸如“开发 / 封闭原则无关紧要”之类的声明会反过来咬住你。
当选项数目有限时,使用枚举代替字符串作为参数。
在模块中安排代码(项目以 .NET 术语表示)。别把所有的东西都放在一个模块里。很快就会失去控制。
你将要解决的业务问题,或者将要开发的业务应用,都是必须牢记的。对于企业来说,代码只是实现目标的一种手段。
将软件开发视为一种手艺。编写出有目的、漂亮的代码。主动去提高自己的技能。
肯定会有开发者对我的一些建议提出质疑,你总能找到不同的观点、方法和想法。
多思考是有益的。对你认为对你有意义的事情要保持批判的态度。
百度竞价关键词出价技巧有哪些?
一、关键词出价策略百度竞价推广中,根据不同的产品、不同地域的消费水平,我们可以通过调整关键词出价的方式进行控制成本。1、对于竞争激烈的词我们可以将价格调低一些,比如原本是10元...
网站标题和关键词的关系是什么?
网站的标题就是用户搜索的词汇或者短语。在搜索引擎中,一个页面通常由两个部分组成:网页主体(即内容)与链接指向的部分。而这两个部分是相互的。那么如何让这两部分的权重都提升呢?这就...
seo短视频优化攻略
一、短视频优化攻略之标题:标题是吸引用户的关键因素,所以一定要重视起来。1、关键词的选取短视频内容中要包含有用户搜索词,并且这个关键词在标题中出现的频次要高。2、内容的布局围绕...
企业网站如何快速被搜索引擎收录
对SEO推广很多人并不陌生,很多站长遇到类似的问题,就是网站的排名没有,特别是一个刚刚接手的新站,网站排名都没有。因此,要怎样才可实现新站排名和收录增长?下面小编将与大家分享下...
企业网站制作需要做策划方案吗?
移动互联网的快速发展,手机网站在近几年也开始赶上潮流了。企业为跟上时代的步伐,也为自己建设手机网站,主要的目的是可以通过手机网站让更多人知道企业,提高企业的知名度。任何事情前都...
延伸阅读
10 条关于 2018 年软件开发的预测,不仅仅是区块链……
区块链、NLP、AI驱动的工具、机器学习、无服务器计算和devops创新将在2018年改变开发者的生活。
开发人员应该对2018年的机遇感到兴奋,产品和工具围绕着诸如区块链、聊天机器人、无服务器功能和机器学习等技术在现实世界的项目中变得足够成熟。与此同时,许多开发人员会担心,在不影响安全性和性能的前提下,他们将无法更快地交付代码和功能。但这方面也有好消息。
对于开发人员来说,2018年的定义是,在抓住转型新机遇的同时,在应对压力的同时,要做得更多,质量更高。以下是有关这些力量将在未来一年如何发挥作用的10个预测。
1. 利用区块链的B2B交易进入生产阶段
企业已经开始了解从区块链启动的交易中获得的安全性、可靠性和效率。在未来的一年,开发人员将在整个金融服务和制造供应链中实施许多区块链用例。区块链是一种技术,它可以使组织之间的高效、安全、不可变、可信的交易成为可能,而这些交易可能不会完全相互信任,从而消除中介。
考虑一家公司从一家离岸制造商订购产品。这些产品通过船运公司发货,通过海关,通过另一家船运公司,最后到达买方。今天,每个步骤的验证和调节主要通过电子邮件和电子表格进行,其中涉及很多人和过程。区块链通过不可撤销的对区块链分类账的更新,消除了手工流及和解,当最少数量的参与者说,“是的,这部分交易发生了。”
区块链云服务将带来可伸缩性、弹性、安全性以及与企业系统的预构建集成,使开发人员更容易将重点放在业务用例上,而不是底层的hyperledger fabric实现。
2. 聊天机器人经常与顾客和员工进行真正的对话
人们已经厌倦了需要多个移动应用程序来做同样的工作,就像三种不同的航空公司应用程序一样,通过不同的方式办理登机手续并获得登机牌。一种更好的方法是提供同样的功能,但是通过手机消息上最流行的应用程序。消息传递有三个具有吸引力的元素:即时、表达性和会话性,不需要培训。由于人工智能和自然语言处理技术的进步,人们将会使用Facebook Messenger、Slack、微信、WhatsApp或像亚马逊Alexa或谷歌Home这样的语音助手,来问问题,并从智能机器人那里得到答案。
开发人员使用新的智能的bot构建云服务,可以快速地制造能够理解客户意图、维护会话状态的机器人,并在与后端系统集成的过程中智能地响应。想象一下你在电影中看到的一件连衣裙的图片,然后把照片传给你最喜欢的服装店的机器人,它使用图像识别和人工智能来推荐相似的服装。员工也可能是机器人的巨大受益者,比如询问他们已经离开了多少个假期,提交了一张帮助办公桌的票,或者订购了一台替换的笔记本电脑,在那里,系统甚至知道员工有哪些笔记本电脑符合资格,并且可以根据他们的订单提供状态更新。考虑到对你自己的员工基础的试验更宽容,开发人员可能会首先利用他们的“造人”能力来建立和测试员工面对的机器人。
3. 按钮消失了:AI变成了app界面
人工智能成为UI,意味着使用应用和服务的同步、请求-响应模型逐渐消失。智能手机仍然是“低智商”,因为你必须去接他们,启动一个应用程序,要求做一些事情,最终得到回应。在新一代智能应用程序中,该应用将通过推送通知启动交互。让我们更进一步,使用人工智能的应用程序、机器人或虚拟个人助手将知道该做什么、何时、何地以及如何做。就这样做。两个例子:
费用审批程序会注意你的报销模式,开始自动审批费用报告的99%,只会让你注意到需要你注意的罕见报告。
分析应用程序了解底层数据,业务用户提出的问题,以及公司其他用户对相同数据集的问题,并且每一天都提供了一个新的见解,分析人员可能没有想到。当组织收集更多的数据时,人工智能可以帮助我们了解需要问哪些问题的数据。
开发人员需要弄清楚哪些数据对他们的业务应用程序非常重要,如何从事务中观察和学习,哪些业务决策将从这种主动的人工智能中获益最多,并开始进行试验。嵌入式人工智能可以预测你需要什么,在合适的时间通过合适的媒体发布信息和功能,包括在你需要它之前,并自动完成你今天手动完成的许多任务。
4. 机器学习采用实际的、特定领域的用途
机器学习正从晦涩的数据科学领域转移到主流应用程序开发领域,这都是因为在流行的平台上可以预先构建模块的可用性,而且在处理大型的历史数据集时,它非常有用。通过机器学习,最有价值的洞察力来自于背景,你以前做过什么,你问过什么问题,别人在做什么,正常的和反常的活动是什么。
但是要想有效,机器学习必须在一个领域特定的环境中进行调整和训练,该环境包括它将分析的数据集和它将回答的问题。例如,设计用于识别安全分析师异常用户行为的机器学习应用程序将与设计用于优化工厂机器人操作的机器学习应用程序非常不同,这可能与基于微服务的应用程序的依赖映射的设计非常不同。
开发人员需要更加了解领域特定的用例,了解要收集什么数据,应用什么样的机器学习算法,以及要问什么问题。开发人员还需要评估特定领域的SaaS或打包应用程序是否适合给定的项目,因为需要大量的培训数据。
使用机器学习,开发人员可以构建智能应用程序来生成建议、预测结果或做出自动化的决策。
5. DevOps走向无操作
我们都同意devops对于帮助开发人员快速构建新的应用程序和特性非常重要,同时保持高质量和性能。devops的问题是开发人员需要花费他们60%的时间在方程的操作一边,从而缩短开发的时间。开发人员必须集成各种持续集成和持续交付(CICD)工具,维护这些集成,并随着新技术的发布不断更新CI / CD工具链。每个人都有CI,但没有太多的人做CD。开发人员会坚持使用云服务来帮助钟摆在2018年回归开发。这将需要更大的自动化。
Docker提供了打包、可移植性以及进行敏捷部署的能力。您需要CD作为Docker生命周期的一部分。例如,如果您正在使用容器,一旦您将代码更改提交给Git,那么构建的默认构件应该是具有新版本代码的Docker映像。此外,映像应该被自动推送到Docker注册表中,并将一个容器从映像部署到devtest环境中。在QA测试和部署到生产之后,应该为您处理容器的编排、安全性和扩展。商业领袖正在向开发者施压,要求他们更快地提供新的创新;devops模型必须为开发人员腾出更多的时间使其成为可能。
6. 开源作为一种服务,加速了开源创新的消费
开源模式仍然是创新的最佳引擎之一,但实现和维护创新往往过于复杂。例如:
您想要一个流数据/事件管理平台,所以您可以转向Kafka。当您开始在规模上使用Kafka时,您必须设置额外的Kafka节点和负载平衡大型Kafka集群,随着Kafka的新版本的发布更新这些集群,然后将此服务与您的其他环境集成起来。
您需要容器编排的Kubernetes。平台应该为您的Kubernetes集群服务,而不是为您的Kubernetes集群处理升级、备份、恢复和补丁。Kubernetes每六个星期航行一次,所以这个平台应该有滚动部署和自我修复。
您需要为NoSQL数据库提供Cassandra。您应该希望备份(在计划中是增量的或完整的)、补丁、集群、扩展和高可用的Cassandra集群,由平台来管理。
开发人员将越来越多地寻找云服务,以便在处理这些技术的操作和管理方面的同时,从开放源码中提供所有的高速创新。
7. 无服务器计算的架构在生产中会变得很大
无服务器架构的吸引力是显而易见的:当需要基于某个事件执行我的代码时,基础架构被实例化,我的代码被部署和执行,而我只在代码运行的时候被收取费用。假设你想建立一个旅行预订功能来预订/取消航班、酒店和租车。每个操作都可以构建为一个以不同语言编写的无服务器函数,如Java、Ruby、JavaScript和Python。没有应用程序服务器在运行我的代码;相反,只有在需要时,函数才被实例化并在基础结构上执行。
对于开发人员来说,将无服务器的函数串在一起执行复杂的事务会带来新的挑战:描述如何将这些函数链接在一起,调试分布式事务,并决定如何在一个函数的链上失败,从而创建补偿事务来取消不适当的更改。寻找云服务和开放源码工具,比如FN项目,通过帮助开发人员轻松地管理服务器功能的编程、组成、调试和生命周期管理,并在笔记本电脑或on - prem服务器或任何云上部署和测试它们,从而繁荣发展。关键是要选择一个提供最大可移植性的无服务器平台。
8. 关于容器的唯一问题是“为什么不呢?”
容器将成为开发/测试工作的默认值,并成为生产应用程序的常见内容。在开源创新和行业标准的驱动下,希望在安全性、可管理性、编制、监控和调试方面持续改进。容器为驱动现代开发的许多趋势提供了构建块,包括微服务体系结构、云本地应用程序、无服务器函数和devops。
容器在任何地方都是没有意义的——例如,当您需要一个更规定性的云平台时,例如集成PaaS或移动PaaS,但是这些更高级别的云服务将自己运行在容器上,并且将是证明规则的异常。
此外,软件许可模型用于高价值、商业、现场的软件,将不得不接受容器采用的传播。软件的定价模型必须支持“打开”和“关闭”许可,因为容器被实例化、放大和缩小。
9. 软件和系统可以自我修复、自我调节和自我管理
开发人员和生产操作团队正在从日志、web /应用程序/数据库性能监视和用户体验监视和配置中淹没数据。此外,这些不同类型的数据都是竖向的,所以您必须将许多人带入一个房间来调试问题。然后就是知识转移的问题:开发人员花了大量的时间来讲述他们的应用程序的输入和输出、设置的阈值、用于监视事务的服务器拓扑,等等。
通过聚合大量的数据到一个存储库(在日志、性能指标、用户体验,和配置,例如),并应用大量的计算能力,机器学习,和专用算法,基于云计算的系统管理服务将大大缓解性能/日志/配置监视。这些云服务将通过观察事务来建立基线,通过观察事务(从必须管理阈值来节省ops团队),并了解与事务自动关联的服务器拓扑。使用针对这些基线的异常检测,系统管理服务将自动能够告诉开发人员,当事情偏离正常的行为时,并能够显示特定事务的问题的根源。
开发人员需要考虑如何在编写应用程序时利用这种自动化,以便能够在云中这些智能管理系统之上创建自管理应用程序。
10. 高度自动化的安全性和遵从性努力成为开发人员的新同盟
尽管开发人员通常认为安全性和遵从性是“其他人的工作”或“交付代码的瓶颈”,但基于机器学习和交付的综合安全性和遵从性机制的出现,将有助于使这些努力与快速的开发步调一致。具体地说,高度自动化的网络防御将被部署到“上游”,以识别和纠正开发和“下游”的潜在安全风险,从而自动调整公司的安全配置文件,以适应正在进行的应用程序和环境变化(识别攻击、修复漏洞和评估持续的遵从性)。
在某些情况下,这种保护是必要的,持续的合规评估是GDPR和类似任务的标志。开发人员、安全专业人员和最终用户都将受益于在devops生命周期中更加严格的、自动化的安全方法。
CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享
五月一来,夏天便悄然而至。flow.ci 也带来了几个新的变化,帮你进一步优化开发工作流。一起来看看这几个重点功能:
-
支持 iOS 项目 Xcode8.3 构建
iOSer 们重点来了,flow.ci 已支持最新的 Xcode8.3 版本进行构建,选择版本时直接选择 Xcode8 即可 :)
-
支持 Git 仓库的缓存
构建工作流到 Git Clone 这一步,打开 flow_cache_repo 按钮,可直接缓存 git 仓库,减少下载时间。
-
构建完成后,可直接在 flow.ci 扫码下载应用
iOS 与 Android 项目,在工作流中添加 fir.im 上传插件,配置好 Token, changelog 等信息。成功构建后,可直接在 flow.ci 构建结果页面扫码下载安装进行测试,不需要登录到 fir.im, 体验更流畅。
(P.S.这只是基本的产物存储,后续会不断优化)
再来看看这期 CI Weekly,整理了软件开发模型对比分析、持续集成 Web 实践、网易客户端的测试与持续集成、Docker 的实践故事小文、基于 Docker 的CI/CD、DevOps 开源工具等技术分享,一起来看看~
软件开发模型与过程改进
软件开发模型直接影响软件开发的周期和软件质量,是软件开发的组织管理形式。 本文介绍了软件工程中开发模型,包括WaterFall模型、螺旋模型、增量模型、RUP(Rational Unified Process)、XP极限编程、Scrum、边做边改模型(Build and Fix Model)等等,来看看如何从中选择适合你的团队的开发模型。(via:博客园@PetterLiu)
网易客户端测试团队转型实践
这篇文章讲解了网易客户端测试团队经历的开发、测试团队的转型实践,从分析测试团队现状到生产力改进、团队人才建设等等,一起看看作者如何带领团队进行转型。(via:移动开发前线@李乐)
Web 持续集成工作实践
随着业务和团队不断扩大,团队面对的问题也越来越具挑战性。作者逐步将一些自动化工具和方法引入到日常工作中,并总结了这一年来做持续集成的获得经验教训。 (via: 公众号运维帮@王集鹄)
DevOps实战-基于Docker的CI/CD
本篇博客作者使用了Spring Boot, GitLab, Jenkins,Docker and Slack,一步步实现全部的持续部署流程。(via : 公众号逼格运维说@彪哥)
张大胖的docker之路
这篇小文章以程序员的视角,写了主角如何一步步爱上 docker 的故事,Build once , run anymore.(via:公众号码农翻身@老刘)
DevOps发展的9个趋势
作为 DevOps 的爱好者,作者总结了 DevOps 未来发展的几个趋势,文中也讲到一些 微服务、Docker、自动化测试、DevOps编程语言等,感兴趣的可以参考一下。(via : ThoughtWorks@顾宇)
Top DevOps Tools: 50 Reliable, Secure, and Proven Tools for All Your DevOps Needs
这里列出了 50 个顶尖的 DevOps工具,一起看看它们各自的特点吧。(via:stackify.com)
__
以上是 CI Weekly #17 的所有技术分享,
如有问题,请联系我们~
Happy building!
flow.ci
CI Weekly 围绕『 软件工程效率提升』 进行一系列技术内容分享,包括国内外持续集成、持续交付,持续部署、自动化测试、 DevOps 等实践教程、工具与资源,以及一些工程师文化相关的程序员 Tips 。同步于 flow.ci Blog、微信公众号、官方微博,知乎专栏,简书,欢迎关注或投稿:)
Go语言实现跨平台开发的经验和教训总结
go语言实现跨平台开发的经验和教训总结
引言:
随着移动互联网的迅猛发展,跨平台开发成为了许多开发者的首选。Go语言作为一门开源的编程语言,因其简洁、高效和跨平台特性而备受开发者的喜爱。在本文中,将总结一些在使用Go语言进行跨平台开发过程中的经验和教训,并通过代码示例来说明。
一、了解目标平台特性与限制
在开始跨平台开发前,了解目标平台的特性和限制是非常重要的。不同的操作系统和设备具有不同的特性和限制,只有了解清楚后,才能更好地进行开发。例如,Android系统和iOS系统在文件系统、网络协议和图形界面等方面存在差异,开发者需要根据不同系统的特性来进行相应的开发。
二、使用Go语言的特性进行跨平台开发
Go语言作为一门面向现代系统开发的语言,提供了许多跨平台开发的特性,可以帮助开发者更高效地进行跨平台开发。
- 使用标准库和第三方库
Go语言提供了丰富的标准库,包括网络、文件操作、并发等功能,可以方便地进行跨平台开发。此外,还有许多第三方库如GoMobile、Gomobile Bind、Gomobile Build等,可以进一步帮助开发者进行跨平台开发。
以下是一个使用Go语言标准库进行文件读写的示例:
立即学习“go语言免费学习笔记(深入)”;
package main import ( "fmt" "io/ioutil" ) func main() { data := []byte("Hello, World!") err := ioutil.WriteFile("example.txt", data, 0644) if err != nil { fmt.Println("Error:", err) return } content, err := ioutil.ReadFile("example.txt") if err != nil { fmt.Println("Error:", err) return } fmt.Println(string(content)) }
- 使用条件编译
Go语言中的条件编译指令可以根据目标平台的不同编译不同的代码,可以帮助开发者处理不同平台的差异。例如,可以使用// +build指令来标记不同平台的代码块。以下是一个简单的条件编译示例:
package main import ( "fmt" "runtime" ) func main() { fmt.Print("You are using ") switch os := runtime.GOOS; os { case "darwin": fmt.Println("Mac OS.") case "linux": fmt.Println("Linux.") default: fmt.Printf("%s. ", os) } }
三、避免平台相关代码的耦合
在进行跨平台开发时,尽量避免使用平台相关的代码,以免造成代码的耦合性增强。可以通过封装平台相关的代码,提供统一的接口,来隐藏平台差异性。此外,还可以使用配置文件、命令行参数等方式来处理不同平台的差异。
以下是一个示例,通过封装平台相关的代码,提供统一的接口来隐藏平台差异:
package main import ( "fmt" "runtime" ) type Platform interface { GetPlatformName() string } type MacPlatform struct{} func (p MacPlatform) GetPlatformName() string { return "Mac OS" } type LinuxPlatform struct{} func (p LinuxPlatform) GetPlatformName() string { return "Linux" } func main() { var platform Platform switch os := runtime.GOOS; os { case "darwin": platform = MacPlatform{} case "linux": platform = LinuxPlatform{} default: fmt.Printf("Unsupported platform: %s. ", os) return } fmt.Printf("You are using %s. ", platform.GetPlatformName()) }
结论:
通过合理地使用Go语言的特性,了解目标平台的特性与限制,以及避免平台相关代码的耦合,可以更好地实现跨平台开发。在实际开发中,开发者还需根据具体情况进行深入研究和实践,以取得更好的效果。希望本文对大家在Go语言实现跨平台开发方面有所帮助。
以上就是Go语言实现跨平台开发的经验和教训总结的详细内容,更多请关注php中文网其它相关文章!
GrimoireLab —— 用于软件开发分析的工具集
GrimoireLab 是一个用于软件开发分析的工具集。它包括一组协调的工具,用于从支持软件开发(存储库)的系统中检索数据,将其存储在数据库中,通过计算相关指标来丰富它,并使其易于运行分析和可视化。
今天关于32 条关于软件开发的建议和教训和32 条关于软件开发的建议和教训怎么写的讲解已经结束,谢谢您的阅读,如果想了解更多关于10 条关于 2018 年软件开发的预测,不仅仅是区块链……、CI Weekly #19 | 关于软件开发模型的思考,以及最新 CI/CD 实践分享、Go语言实现跨平台开发的经验和教训总结、GrimoireLab —— 用于软件开发分析的工具集的相关知识,请在本站搜索。
本文标签: