Github 热门,程序员想拿高薪建议都看看

GitHub上标星1.5w,被B站使用,flv.js开源作者月薪还不到5k!学历对程序员有多重要? 大数据文摘出品作者:刘俊寰上周,文摘菌向大家介绍了在美国当数据科学家的年薪水平,发现科学家们的整体薪资走势虽然有所下降,但是年薪中位数保持在12万美元左右。同一时间,知乎上一个很老的话题忽然被重提,也和开发者的薪酬有关。B站三年前开源的flv.js项目大火,标星超过1.5万,但是项目的开源作者谦谦(网名)被曝月薪竟然还不足5000?年薪不到6万人民币?对比一下简直是天壤之别!截止到发稿时,知乎上的... 阅读详情

点击上方“编程派”,选择设为“设为星标”

优质文章,第一时间送达!

转自:机器之心

1 月 20 日,GitHub 趋势榜第一的项目来自架构师 Justin Miller,他分享了自己关于「如何成为更好的软件架构师」的想法。这个 repo 现在已有 5.6k star。

https://github.com/justinamiller/SoftwareArchitect

几年前有人问我:「你是怎么成为一名软件架构师的?」我们就此探讨了必备技能、经验,以及储备相关知识所需的时间和精力。除此之外,我也回顾了自己走过的路、使用或尝试过的技术,以及我从那些五花八门的工作中学到的东西。

架构师技术路线图

软件架构师是什么?

在进行深层次的探讨之前,我们先来看两个定义:

  • 软件架构师:是指那些制定高级设计决策,并确定技术标准(包括软件编程标准、工具和平台)的软件专家。这之中的首席专家就是总架构师。(来源:Wikipedia: Software Architect)

  • 软件架构:是系统的基本组织构成,这种组织主要体现在其组件、组件之间的关系、组件与环境之间的关系,以及决定系统设计与演化的原则。(来源:Wikipedia: Software Architecture)

架构的「层级」

架构主要可以抽象成以下几个「层级」。不同层级所需的技能也不同。尽管对层级的分类有很多种标准,但是我最喜欢把架构分成 3 个层级:

  • 应用级:最低层级的架构。只关注单一的应用。层级低,但是很详细。这方面的交流一般是在一个开发团队内展开;

  • 解决方案级:架构的中间层。关注一或多个满足业务需求的应用(也就是商业方案)。这之中有些设计是高层次的,但大部分还是低层次的设计。这种层级架构的交流就开始涉及多个团队了;

  • 企业级:架构的最高层级。关注多个方案。这种架构的设计层次高且抽象,因此也需要方案级和应用级的架构师对此进行细化。这种层次的架构就需要多个组织进行沟通了。如果你想了解更多,可以参阅这个链接:https://github.com/justinamiller/EnterpriseArchitecture。

有时候,架构师也被看做不同工作组之间的粘合剂。以下是三个例子:

  • 横向:在业务部和开发人员或是不同的开发团队之间架起沟通的桥梁;

  • 纵向:在管理者和开发人员之间架起桥梁;

  • 技术:将不同的技术或应用整合在一起。

软件架构师的日常

要了解架构师的必备技能,我们得先知道架构师主要做什么。我认为架构师最重要的活动包括:

  • 定义和确定所需的开发技术与平台;

  • 定义开发标准,如编程标准、工具、审核流程、测试方法等;

  • 对确定和理解业务需求提供支持;

  • 设计系统并根据需求做出决策;

  • 对架构定义、设计和决策进行讨论记录;

  • 检查并审核架构与代码,比如检查前期确定的模式与编程标准是否被正确实施;

  • 与其他部门和架构师合作;

  • 对开发人员的引导及咨询;

  • 将高级设计细化,并转化为较低级的设计。

注意:架构设计是一项持续性的工作,尤其是在敏捷软件开发过程中。因此,我们会一遍又一遍地重复这些工作。

软件架构师必备技能

为了完成上面说的那些工作,架构师需要具备一些特定的技能。从我的个人经验、相关书籍和讨论中,我们可以将其总结为以下 10 项技能:设计、决策、简化、编程、记录、沟通、估算、平衡、咨询、市场。

接下来我将逐一介绍这些技能。

设计

首先最重要也最难回答的问题就是「什么是好的设计」。我将从理论和实践两个层面进行阐述。就我的经验来说,两者兼备才是最好的。那我们先说一下理论层面吧:

  • 了解基本的设计模式:模式是架构师开发可维护系统所需的最重要工具之一。基于这些模式,你可以把一些已经在其他问题上奏效的方案迁移到一些模式相同的新问题上。「Gang of Four」(GoF) 所著《Design Patterns: Elements of Reusable Object-Oriented Software》是所有从事软件开发的人的必读书。尽管这些模式发布于 20 多年前,它们仍是现代软件体系结构的基础。例如书中的模型 - 视图 - 控制器(Model-View-Controller,MVC)模式就被应用于许多领域,它同时也是一些新模式(如 MVVM)的基础;

  • 再挖深一点,研究一下模式与反模式(anti-pattern):如果你对 GoF 所写的模式具备全面的了解,那么你就可以学习更多的软件设计模式了,或者深挖你感兴趣的领域。在应用集成领域,我最喜欢的一本书是 Gregor Hohpe 编写的《企业集成模式》。当两个应用需要交换数据时,无论是来自一些遗留系统的老式文件交换还是现代微服务体系结构,这本书的内容都适用;

  • 了解质量度量:定义架构还不算完,还要解释为什么要定义、应用并控制这些准则和编程标准。这样做是因为需要控制质量,满足一些非功能需求。我们想要的是一个可维护、可靠、可适应、安全、可测试、可扩展、可用的系统。而实现所有这些要求的方法就是有一个好的架构设计方法。你可以在维基百科上了解更多关于质量度量的信息。理论很重要,但是如果你不想成为一名活在象牙塔里的架构师,实践也同样重要,甚至更加重要;

  • 尝试并理解不同的技术栈:我认为这是你成为更好架构师之路上最重要的一步。尝试新的技术栈,并了解其发展历程。这些不同的技术具有不同的设计理念和模式。只浏览 PPT 学不到太多东西,你需要自己去尝试并感受这项技术的喜与悲。架构师不仅要有广博的知识面,还要在一些领域有深厚的积累。重点不在于掌握所有的技术栈,而是对你所在领域最重要的技术有坚实的理解。你还可以尝试一些领域外的技术,例如,如果你对 SAP R/3 有很深的了解,你应该尝试一下 JavaScript,反之亦然。尽管如此,双方都会对 SAP S/4 Hana 的最新进展感到惊讶。例如,你可以自己尝试并免费参加 openSAP 的课程。保持好奇心,多尝试新事物,也可以尝试一些几年前不喜欢的东西;

  • 分析和理解应用模式:查看任意当前框架(如 Angular)。你可以在实践中学习到很多模式(如 Observables),你还应该试着理解它是如何在框架中应用的,为什么要这样做。如果你是真正的专业人士,你还需要更深入地研究代码并了解它是如何实现的;

  • 保持好奇心,关注用户群。

决策

架构师需要制定决策,指引项目甚至整个公司的正确方向。

  • 分清主次:不要在不重要的决策和工作上浪费时间,要学会分清主次。就我个人来说,我比较喜欢通过以下两个特征来判断一件事是否重要:

  • a. 概念完整性:如果你一开始决定了一个理念,坚持下去,即使有时候用不同的方法做会更好。这样整体概念就更清晰明确,提升了可理解性,也简化了维护过程。

  • b. 一致性:例如,如果你定义并应用了命名约定,那么它不是关于大写或小写的,而是以相同的方式应用于所有地方。

  • 优先级:有些决定非常关键,如果没有及早采取合适的解决方案,很有可能给日后造成无法解决的问题。这对维护人员来说来说是一场噩梦,或者更糟的,开发人员在这个决策制定之前无法继续工作。在这种情况下,先做一个「糟糕」的决定甚至比没有决定更好。但是在这种情况发生之前,你要知道哪些决定是应该被优先处理的。有很多方法可以做到这一点。我建议先看看加权最短作业优先(WSJF)模型,它在敏捷软件开发中被广泛使用。尤其是时间临界和风险降低,对这二者的度量是评估架构决策优先级的关键;

  • 认清自己的能力:不要在能力范围之外的事情上做决定。这很重要,因为如果不加以考虑,它可能会严重破坏你作为架构师的地位。为了避免这种情况,你应该和同事明确自己的职责和角色。如果有不止一个架构师,那么你应当只负责当前负责的架构层级。作为一个较低层级的架构师,你应该为更高层级的架构提出建议,而不是做出决策。此外,我建议你经常和同事一起检查重要的决定;

  • 评估多种选择:在做决定时,总是要列出多个选项。在我参与的大多数案例中,都有不止一个可能的(优秀)选择。不好的选择主要有这两个特点:(1)看起来你没有完成好自己的工作;(2)有碍于作出正确的决定。定义度量后,你就可以根据事实(如许可证成本或成熟度)来比较各种选择,而不是通过直觉。这通常会让你做出更好、更可持续的决策。此外,将该决策推广到其他部门也会更容易。但是如果你没有正确评估选项,在最终讨论时你可能会失去一个重要的论据。

简化

时刻记住奥卡姆剃刀原则,也就是简单即正义。我对这个原则的理解是这样的:如果你的解决方案是在做了很多假设的基础上提出来的,那么你的方案很可能是错的,也很可能会变得极其复杂。这个时候你就应该减少(简化)一些假设,以获得更好的解决方案。

  • 多方位观察解决方案:为了简化解决方案,经常需要你调整对解决方案的观察角度。比如,你可以尝试通过自顶向下和自底向上的思考来获取解决方案。如果你有一个数据流或流程,那么首先考虑从左到右,然后再考虑从右到左。在简化过程中询问自己:「在完美的世界里,你的解决方案需要做什么修正吗?」,或者「某公司 / 某人会怎么做?」。这两个问题都可以帮助你按照奥卡姆剃刀原则来简化假设;

  • 退一步:经过激烈而漫长的讨论后,常常会得到一些极其复杂的方案。永远不要把它们当做最终的结果。「退一步」的意思就是:再次从宏观角度看一下这个问题,当下的方案还说的通吗?然后再在抽象层面对方案进行重构。有时候暂停讨论第二天再继续是个不错的选择。至少对于我来说,我的大脑需要一些时间来处理信息,想出更好、更优雅和更简单的解决方案;

  • 分而治之:把大问题分解成更小的问题,然后分别解决小问题,并验证这些小方案是否匹配。最后再退一步来看一下总体情况;

  • 重构并非坏事:如果找不到更好的解决方案,那么修正一个复杂的解决方案也是不错的选择。如果某个解决方案问题很多,你可以稍后重新思考该方案,再将想到的新东西应用到该方案中。重构并非坏事,但是在你开始重构之前,请记住:(1)准备好足够的自动化测试,以确保系统的正常功能;(2)获得利益相关者的支持。要了解更多关于重构的知识,我建议阅读 Martin Fowler 写的《Refactoring. Improving the Design of Existing Code》。

编程

即使作为企业级架构师(最抽象的架构层级),你仍然应该了解开发人员的日常工作。如果你不了解开发如何完成的,那你可能会面临两个主要问题:

  1. 开发人员不接受你的说法;

  2. 你不了解开发人员的挑战和需求。

  • 开展副项目:做副项目的目的是尝试新技术和工具,从而发现目前和未来的开发方式。经验是观察、情感和假设的结合 (《Experience and Knowledge Management in Software Engineering》,Kurt Schneider 著)。阅读教程或对利弊的介绍当然好,但这只是「书本知识」。只有当你自己尝试时,你才能体验到开发人员的情绪,才能对事情好坏背后的原因做出假设。使用一种技术的时间越长,你做出的假设就会越好。这会帮助你在日常工作中做出更好的决定。我刚开始编程时,并没有代码补全功能,只有一些可以加速开发的实用程序库。显然,把那时候的背景知识用在今天,我会做出错误的决定。现在我们有大量的编程语言、框架、工具、流程和实践。只有当你有经验,对主要趋势有粗略的了解时,你才能参与到讨论中来,并将开发引向正确的方向;

  • 只尝试需要尝试的事情:你不可能尝试所有的事情,这根本是不可能的。你需要一个更结构化的方法。我最近发现了一个资源:ThoughtWorks 的技术雷达,他们将技术、工具、平台、语言和框架分为四类:采纳、试验、评估和暂缓。采纳表示「强烈建议业界采用这些技术」,试验表示「企业应当在风险可控的前提下在项目中尝试应用此项技术」,评估表示「它对企业的影响还需探索」,暂缓表示「谨慎行事」。有了这种分类方法,我们更容易获得新事物的概况,并更好地评估下一步要探索的趋势。

记录

架构文档有时很重要,有时却不那么重要。例如,架构决策或代码指南是重要文档。在开始编程之前,通常需要初始文档,并且对此不断细化。因为代码也可以作为文档(如 UML 类图),所以有些文档可以自动生成。

  • 代码整洁:好的代码本身就是最好的文档。好的架构师应该拥有辨别好坏代码的能力。Robert C. Martin 写的《Clean Code》就是这方面很好的学习资料。

  • 在可能的情况下生成文档:系统变化很快,因此文档很难及时更新。无论是 API 还是以 CMDB 形式出现的系统环境:底层信息的变化往往太快,因此无法手动更新相应的文档。例如:如果你的 API 是模型驱动的,你就可以根据定义文件自动生成文档,或者直接从源代码生成文档。有很多工具可以帮你完成这项工作,我认为 Swagger 和 RAML 是很好的起点。

  • 尽可能多记必需的东西,内容尽可能少:不管你需要记录什么(如决策文件),试着一次只关注一件事,只记录这件事的必要信息。丰富的文档很难阅读和理解,附加信息应保存在附录中。特别是决策文件,更重要的是要讲一个有说服力的故事,而不是抛出大量的论据。此外,这还能为你和你的同事节省大量时间,因为你们必须阅读这些文档。看看你过去做过的一些文档(源代码、模型、决策文件等),然后问自己以下问题:「用于理解该文件的所有必要信息都包括在内了吗?」、「哪些信息是真正需要的,哪些可以省略?」、「文档有红线吗?」

  • 更多地了解架构框架:这一点也适用于所有其他「技术」类建议。我之所以把它放在这里,是因为像 TOGAF 或 Zachmann 这样的框架提供了「工具」,这些工具在文档站点上很重要,尽管它们的附加价值并不局限于文档。深入了解此类框架将教会你更系统地处理架构。

传送门:

https://github.com/justinamiller/SoftwareArchitect

回复下方「关键词」,获取优质资源

回复关键词「 pybook03」,立即获取主页君与小伙伴一起翻译的《Think Python 2e》电子版

回复关键词「入门资料」,立即获取主页君整理的 10 本 Python 入门书的电子版

回复关键词「m」,立即获取Python精选优质文章合集

回复关键词「book 数字」,将数字替换成 0 及以上数字,有惊喜好礼哦~

题图:pexels,CC0 授权。

好文章,我在看❤️

嵌入式软件工程师的职业发展路线 总结起来,成为一名优秀的嵌入式软件工程师需要掌握编程基础和计算机体系结构,深入了解嵌入式系统和硬件知识,熟悉实时操作系统(RTOS),掌握通信协议和网络编程技术,并持续学习和跟踪行业发展。通过学习这些知识,嵌入式软件工程师能够更好地理解嵌入式系统的工作原理,并能够进行底层的驱动程序开发和硬件调试。嵌入式软件工程师是专注于开发和维护嵌入式系统的专业人员,嵌入式系统通常是嵌入在各种设备中的计算机系统,例如智能手机、汽车控制系统、医疗设备等。学习RTOS的使用和原理对于嵌入式软件工程师来说是至关重要的。 阅读详情

相关推荐

Ubuntu 20.04 系统备份和还原

最近大家Ubuntu开发环境,经常出现搭着搭着系统就挂了,于是开始琢磨了Ubuntu系统的备份和还原,以备不时之需,Linux环境搭建实在是有点太细,好多情况下,就算曾经搭建过一遍,再次搭建有些包还是忘了安装,做好备份是十分必要的。 经过了一番研究,Ubuntu备份有很多方式:根目录tar、dd、Systemback(1.0版本已经不维护了,2.0版本收费)等等,最终决定使用 —— Timesift, 因为方便一些。 文章参考:小马虎的救星——Timeshift Timeshift Timeshift,是L

Z_Paper的博客 2万+

什么是WSJF – Weighted Shortest Job First

百度把Weighted Shortest Job First翻译成加权最短作业优先,听起来还是觉得翻译得不错。WSJF是一种敏捷用来排任务优先级的方法。 SAFe引入了敏捷火车ART(Agile Release Train),它把原本一个一个项目从开始到结束,又一个开始,又一个结束这样的模式,编程了一个流水线的工作模式。有项目就把项目往敏捷火车上扔,流水线式的工作方式,这样大大减少了原先

睡猫的博客 7187

海思Hi3516DV300实战:从yolov5模型训练到Sort跟踪算法的完整部署流程

本文详细介绍了在海思Hi3516DV300芯片上部署YOLOv5目标检测与Sort多目标跟踪算法的完整流程。内容涵盖从特定场景数据训练YOLOv5模型、模型格式转换(PyTorch到ONNX再到Caffe),到利用海思NNIE引擎生成WK模型并进行端侧集成与优化的全链路实战经验,旨在解决嵌入式设备上实时人流量统计等实际应用挑战。

weixin_29034963的博客 341

GitHub下载量从19暴涨到5W,这份架构师学习路线只用了一晚

现在Java内卷严重,由于正常面试无法快速地筛选出人才,就好比一个富豪需要招一个司机,结果来了1000人来应聘,要想快速招聘到合适的人选,那么面试官该怎么办?他只能去问一些比较高端的问题,比如不是本科的淘汰,30岁以上的淘汰,不知道齿轮传动原理的淘汰等等。但是有没有人真正的静下心来去思考,是哪个阶段的内卷严重?你觉得阿里P7内卷吗?不要总是杞人忧天,技术人就是以技术为主,把技术提上来一切都不用担心;如果想要摆脱内卷的束缚,那么这份P8修炼手册你或许该好好地阅读一下。文中资料领取。

架构大数据双料架构师的博客 512

别再只会用串口助手了!手把手教你用手机App调试HC-05蓝牙模块(STM32F103实战)

本文详细介绍了如何利用手机App调试HC-05蓝牙模块与STM32F103的无线连接,突破传统串口助手的限制。通过实战指南,开发者可以掌握移动性测试、实时监控和快速验证等高效调试技巧,优化蓝牙透传的稳定性和性能。

weixin_33670786的博客 428

KEIL5编译报错L6200E:__stdout重定义问题分析与解决

本文深入分析KEIL5编译报错L6200E中__stdout重定义问题的根源,指出因未完整定义__stderr导致与标准库stdio_streams.o冲突。提供完整重定义标准流、启用MicroLIB库等解决方案,帮助开发者彻底解决Symbol multiply defined错误,提升嵌入式开发效率。

uran的专栏 957

排序算法有哪些_精打细算—敏捷中的排序算法(上)

“敏捷号”列车系列——《知识讲堂》文/冯思成前 言在软件开发需求管理领域,调度排序问题一直以来都是核心问题。哪些工作需要先做,哪些工作要排在后面,一直困扰着从业人员。如果只是简单地说重要的工作要优先做,虽然这个原则大家很容易达到一致,但是何谓“重要”,遇到具体的案例时往往公说公有理、婆说婆有理,经常出现无法精确判断的情况。因此我们不仅要有指导的原则,更需要有一个可以量化的方法,使我们能更...

weixin_39669701的博客 784

OpenClaw人人养虾:配置通义千问(Qwen)

通义千问(Qwen)是阿里云推出的大语言模型系列。OpenClaw 支持通过 Qwen Portal 插件实现 OAuth 免费额度认证,每日可免费使用 2000 次请求,无需绑定支付方式。

王国平的博客 1265

GitHub标星百万的程序员转架构之路,竟被阿里用作内部晋升参考

通过本书的系统学习,读者将在苔通开发人员的基础上向前跨出一大步,在思想、方法论、实践能力和综合素质等各个方面往一名合格的架构师方向发展,为后续的工作和学习铺平道路。学习不难,贵在自觉和坚持!

Park33的博客 277

DeerFlow 系列教程 附录 | 核心文件索引、官方文档索引与推荐阅读顺序

DeerFlow 系列教程 附录本附录汇集了 DeerFlow 项目的核心文件索引、官方文档索引和推荐阅读顺序三份速查资料,方便读者在日常开发和学习中快速定位关键代码与文档。内容按实际项目目录结构整理,所有路径均基于 DeerFlow 2.0 版本验证。

weixin_43674738的博客 328

短距激光雷达专业讲解:定义、架构、技术路线与选型逻辑

短距激光雷达,通常指有效探测距离不大于 50 米的激光雷达产品。它主要服务于服务机器人、扫地机器人、AGV/AMR、无人机、智能手机、AR/VR、工业安全等中近距感知场景。它与车载中长距激光雷达的最大区别,不是“探测距离短一点”,而是整套工程目标不同。短距激光雷达的核心诉求是:小体积、低成本、高帧率、强抗光、嵌入式集成。单价从百元级扫地机模组,到数千元级工业 3D 雷达不等。一句话概括:中长距车载激光雷达追求远距离、高可靠、车规寿命;

致力于lidar应用开发 151

全栈开发者必看:2024年热门编程语言学习路径与高薪就业指南

全栈开发者必看:2024年热门编程语言学习路径与高薪就业指南

lpl1123143的博客 1713

lammps教程:FeNiCr合金多晶结构建模方法

大家好,我是小马老师。 本文介绍合金多晶模型的建模过程,使用的软件为Atomsk。 Atomsk是一个开源软件,可运行在windows、linux等多种操作系统上,本文使用windows版的Atomsk实现建模,其他操作系统的建模命令基本相同。 建模过程如下: 1. 生成单晶Fe晶胞 atomsk --create fcc 3.65 Fe Fe.xsf 2. 建立多晶节点文件polycrystal.txt 新建一个文本文件polycrystal.txt,文件内容为: box 200 100 200 ran

lammps_jiayou的博客 6658

程序员需要达到什么水平才能顺利拿到 20k 无压力?

当前你这一岗位市场价是多少?你的技术能力应该拿到多少的薪资合适?现在最热门的技术是什么?这些问题我不能替你回答,只有你自己去探索,去了解,因为它太具有时效性,也太因人而异。这里着重推荐5个平台,让大家对自己的能力有所了解,时刻保持敏锐的洞察力。Google一下,你就知道。了解当下的时政要闻,当然也可以在这里寻找到更多你想看的网站,举一反三。②BOSS直聘:了解当前市场行情最简单粗暴的方式,你的工作年限和技能到底值多少钱,和HR聊聊就知道了。③程序员客栈。

Mr_HelloWorldx的博客 1万+

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

LeetCode 到底怎么刷?GitHub 上多位大厂程序员亲测的高效刷题方式

点击上方“五分钟学算法”,选择“星标”公众号 重磅干货,第一时间送达 在众多的诸如阿里、腾讯等大厂之中,最看中面试者刷题技能的大概要数有“链表厂”之称的字节跳动了。作为一个新晋大厂,字节跳动以高薪、技术大佬云集吸引了众多的程序员呢,问题来了,怎么才能进入“链表厂”呢?答案之一:刷题! 刷题就不得不提 LeetCode 了,如何高效地刷 L...

墨鱼菜鸡 1445

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

看完 GitHub 官方的 2021 年度报告,才发现原来全球程序员好像都在卷呐

【导读】GitHub重磅发布2021年度报告,透露了一个数据:全球已有超过7300万的GitHub开发者用户,几乎近60%来自北美之外的地区。其中,中国有755万,位居全球第二。 7300万开发者在365天里能做什么? 全球最大开发者社区GitHub重磅发布2021年度报告,透露了一个数据:GitHub目前在全球已有超过7300万开发者用户,其中56.8%来自北美之外的地区。 在新冠疫情仍未褪去的2021年, 今年的Octoverse 报告中体现了全球的开发者如何以更智能、更可持续的方式开发代码、创建.

m0_61098809的博客 2193

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

腾讯学长分享的Java八股文,成为GitHub热门资源,下载量突破百万

(含:单例模式,工厂模式,抽象工厂模式,建造者模式,原型模式,适配器模式,装饰器模式,代理模式等23种设计模式...)(含:mysql数据库基础知识,数据类型,失误,试图,mysql索引,mysql锁,mysql优化,等...)(含:Java概述,语法,面向对象,IO流,API,集合,NIO,HashMap,基础常见面试题....)(含:分布式系统原理,数据分布式方式,基本副本协议,Lease机制,Dubbo,集群,分布式锁,等...)(含:22大问题,从基础到高级,BATJ面试常问的点...)

知识分享官 1053

程序员每天会阅读哪些技术网站来提升自己?

其实很多程序员对外包接单都有误解,觉得外包接单平台上的项目都是一些边缘的、没人愿意干的项目,虽然这类项目在外包平台也占了不少的比例,但在外包平台上还有很多当下最前沿的、最热门的项目,只是苦于公司人手不足或是招不到对口的人才,所以在外包接单平台上寻找机会。内容是全英文的,如果英文水平不好,网站也提供基础的中文翻译,但我还是建议大家啃一下英文的,毕竟技术相关的资讯涉及的英文词汇也就那些,更多的是些技术栈的专有名词,多学点对自己总是有益无害的。而这就是我最经常使用的网站之一。当然,最重要的是,给自己挣点小外快。

Mr_HelloWorldx的博客 787

Java程序员大模型转型宝典:四大机遇与挑战,五大策略助你实现高薪就业!

文章分析了Java程序员转行大模型的四大机遇(技术升级、市场需求、薪资提升、跨界合作)与四大挑战(技术门槛、知识重构、资源不足、竞争激烈),提出五大转型策略:明确目标、系统学习、积累经验、拓展人脉和调整心态。作者提供了分阶段学习路线图,从大模型系统设计到多模态应用开发,帮助Java程序员抓住AI时代新机遇,实现职业转型。

datian1234的博客 1334

2025后端开发薪资全景报告:全球职位数据揭示的高薪密码与职业规划指南

GitHub加速计划(vag/vagas)是一个通过GitHub Issues发布后端开发职位的平台,为开发者提供了丰富的就业机会。本文将基于该平台的全球职位数据,深入解析2025年后端开发领域的薪资现状,并为从业者提供科学的职业规划建议。 ## 后端开发职位市场概览 后端开发作为技术领域的核心岗位,需求持续旺盛。通过GitHub加速计划的职位发布数据可以看出,全球范围内对后端开发者的需求呈现

gitblog_00538的博客 1013

「程序员做饭指南」冲上热榜!网友评论:前无古人!

有人说,做菜和编程是相通的。开始我并不能理解其中的奥义,直到近日,播妞在GitHub上发现一个名为「HowToCook」的项目,我恍然大悟 ....没错,这是一份「程序员的做饭指南」,可它...

传智播客的专栏 500

github java开源项目经验_2020年4月Github上最热门的Java开源项目

来自:开源最前线(ID:OpenSourceTop)4月份GitHub上最热门的Java开源项目排行已经出炉啦,本月的榜单都被Spring相关的项目占领了,一起来看看上榜详情吧1spring-boot-demohttps://github.com/xkcoding/spring-boot-demo Star 13090spring boot demo是一个用来深度学习并实战spring ...

weixin_39721807的博客 172

2018程序员必备的4大网站推荐(代码、编程、SQL等)

科技时代,程序员是一个热门行业,也是一个高薪行业,很多人很羡慕程序员,其实作为一名合格的程序员,要不断的提升自己,因为科技也在不断进步,所以,接下来小编分享5个程序员必备网站,包括代码、编程、SQL等,需要的朋友可以收藏起来慢慢学哦。 一、百度 百度是我们常用的中文搜索引擎,它包含各个方面的信息,当然程序员方面的知识也不少,包括Javaccript、CSS、代码、软件等等,应有尽有。 二...

佛系软件 6364

网络安全人才缺口与高薪岗位解析

网络安全作为数字化转型中的关键领域,正面临日益严峻的人才缺口问题。随着攻击面的扩大和合规要求的提升,云安全、工控安全等细分领域的技术人才需求激增。从技术原理来看,现代网络安全已从传统的防火墙运维转向更复杂的威胁检测、数据隐私保护等领域。这种转变使得具备实战能力的安全工程师薪资溢价显著,特别是在掌握Kubernetes安全策略、自动化脚本编写等技能的情况下。应用场景涵盖金融、医疗、制造等多个行业,其中云安全架构师、威胁狩猎专家等岗位尤为紧缺。本文通过分析行业现状和未来趋势,为零基础转型者和资深从业者提供实用的

weixin_33853794的博客 347

2021年金九银十:程序员从这两个开源项目开始准备

今天为大家带来两个GitHub上热门的Java开源项目,主要为大家2021年金九银十准备的。 LeetCodeAnimation(Star:48.1k) https://github.com/MisterBooo/LeetCodeAnimation LeetCode相信大家都知道,很多同学都在上面刷题:算法题、面试题。也有很多国内外大神级程序员在上面分享他们的工作经验,LeetCode不用多说,程序员必须经常泡的一个网站!LeetCodeAnimation:该项目发起者计划用3到4年的时间将LeetCo

Java_cola的博客 545
上一篇: 这段 Python 代码,可以让你脱单
下一篇: 不用游标卡尺,Yaml 格式 5 分钟入门
codingpy
博客等级 码龄11年 1873粉丝 104原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值