• 关于

    中小企业小程序工具设计

    的搜索结果

问题

支付宝小程序云训练营优秀学员提问来啦

看书学不够,想要跟着大佬实操!为了满足大家这个愿望,开发者社区特别推出小程序云7天训练营,为大家请到支付宝专家团队,旨在从认识小程序云,到掌握云开发、小程序...
问问小秘 2020-06-15 15:57:38 159 浏览量 回答数 1

问题

如何分辨出一个网站的好坏

如何分辨出一个网站的好坏 网站的访问速度    一个网站的打开速度就能直接影响到用户是否愿意打开你的网站了,要是你的网站打开速度慢,即使你的网站功能再强大,页面再好看,...
奈斯哈 2019-12-01 21:28:36 1965 浏览量 回答数 1

回答

能力地图,让你的小程序拥有灵魂 开放能力,是支付宝开放平台为满足开发者不同的业务需求,将支付宝的一些功能 以接口(API)的形式开放出来;开发者通过这些开放的接口与支付宝服务端(也 有部分是支付宝客户端)进行交互,实现业务逻辑。 举个例子,假设你是老王,你开发的小程序是用来卖瓜的。那你要让你的用户在你 的小程序内花钱买你的瓜,这样你就要接入“小程序支付”能力;你要在小程序内 营销你的瓜,那么就录个带货的视频吧,那么就要使用“小程序视频播放”能力。 总之,你需要贴合你的小程业务需求,不断地“武装”你的小程序。而开放能力也 是你的“军火库”,为你提供源源不断的业务支持。 目前,小程序提供如下的开放能力,这些能力构成了一张“能力地图”。根据这张 地图,你的小程序可以走出自己的路。 随着业务的不断发展,“能力地图”的版图会越来越大,为开发者提供更多福利。 点击进入 能力中心 PC 端;或扫码收藏 能力中心 小程序,随时关注能力动态; 分享能力更方便。 能力实战 本章将重点介绍“获取会员基础信息”和“模板消息”的接入。 缘起:获取会员基础信息 盛夏的图书馆总是学生们避暑的热门景点,对软件学院的大二学生小宝♂️来说也 不例外。窗外的知了没完没了的絮叨着,小宝双手赌气似的敲打着键盘,指尖生了 魔法似的溜出一行行代码。刚写完一整段的小明将面前的冰咖啡一饮而尽,顺势将 脑袋抬起来,盯着浅黄色的天花板发呆。正兀自发呆着,精神恍惚小宝被一股淡淡 的茉莉花香拉回了图书馆,循着香味,他将脑袋慢慢地低下。四目相对,香味的源 头♀️也正好奇地盯着他...... 问:所以,小宝要如何主动又不失礼貌,深入而不猥琐地了解关于她的一切呢? 答:通过小程序“获取会员基础信息”能力,在用户授权后,开发者可以获取用户 头像图片、昵称、性别、国家、所在省份、所在市区等信息。 本题干的案例和场景仅为课堂效果定制,纯属虚构,请勿作死模仿。对于恶意获取 用户信息或者其他不合理使用等情况,支付宝开放平台有权永久收回该小程序的接 口权限。 代码千万条,用户第一条。接入不规范,老师两行泪。 105 产品介绍 获取会员基础信息是支付宝会员开放服务之一,在获得用户授权后,允许开发者获 取 头像、昵称、性别、国家码、所在省份、所在市区 等信息。本功能免费,同学 们可以放心使用(别问落地价,因为爱情无价)。 当然,小程序还有 获取会员手机 号 (https://opendocs.alipay.com/mini/introduce/getphonenumber) 的开 放能力,因该功能涉及用户的手机号隐私,且仅开放给有一定资质的企业账户,故 在本章不作接入介绍。(小宝哭晕在厕所......) 用户端示例 用户在登录小程序后,在需要用户授权基础信息的场景(如首次登录,或者授权其 他关联账号登录等),系统出现弹窗让用户确认,用户同意授权后,即可通过接口 获取用户的基础信息。 注意: 通过用户信息授权方式获取用户基础信息是只一种快捷的填写方式。开发过程中, 需要对用户拒绝的情况做充分的考虑与应对方案,如引导用户手动填写或上传。 缘生:模板消息 因为请对面的女生帮忙一起测试“获取会员基础信息”的缘故,小宝无意间得到了 对面女生的昵称和头像。 “原来你叫小美啊,你的支付宝头像是莫奈的《日出》吗?你喜欢画画?” “对呀,我是设计学院的,平时喜欢画画。看不出你个程序员还知道莫奈啊。” “我也很喜欢印象派。但我觉得你更适合莫奈的另外一幅画。” “哦,什么画呀?” “《睡莲》” 问:看得出小宝已经词穷了,再聊下去就很尴尬了,看得出小宝也是个害羞人。请 问小宝要如何进一步拉近关系,约小美出去自习和玩耍呢 ? 答:通过小程序“模板消息”能力,开发者可通过消息高效触达用户,通知用户当 前行为的结果及状态等;同时可在消息中配置跳转小程序指定页面地址,当用户查 看消息时,在消息中点击 进入小程序查看 返回小程序,进入开发者配置的小程序 指定页面。目前仅支持文本消息。 本题干的案例和场景仅为课堂效果定制,纯属虚构,请勿作死模仿。支付宝开放平 台对于模板消息的发送频率和内容均有一定限制。对于恶意发送违规定模板消息的 行为,支付宝会有一定的惩罚策略,详细注意事项可以参考 模板消息准入条件。 代码千万条,用户第一条。接入不规范,老师两行泪。 产品介绍 模板消息有两类:交易类 和 表单类,暂不支持自定义标题等信息。支付类的模 板消息需要依赖用户支付产生的交易号 tradeNo, 因此本章节不重点阐述,好奇 宝宝请前往本章结尾的“拓展阅读”查看。 自己不开店,没有交易号(tradeNo)的小宝别无选择,只能选择表单类模板消 息。 表单类:当用户在小程序内发生过提交表单行为,开发者可以调用接口发送表单类 的模板消息,此时必须要传入 form_id 。开发者获取 formId 或 tradeNo 后, 可在 7 天内向用户推送有限条数的模板消息( 1 次提交表单可下发 3 条,不 限制模板数);超期后 formId 或 tradeNo 将失效,无法推送消息。 本功能免费,同学们可以放心使用(别问落地价,因为爱情无价)。 用户端示例 108 假设小宝在发送模板消息发送成功后,小美可以在支付宝 APP 首页的“服务提 醒”处查看消息,如下图所示。 快速接入 DEMO 支付宝开放平台还为开发者提供了模板消息 DEMO,开发者可以参 考 https://opendocs.alipay.com/mini/quick-example/template-message 文档进 行体验和实现快速接入。 拓展阅读 除了用 formId 发送模板消息外,支付宝开放平台还支持用 tradeNo 发送模板 消息,那如何获取 tradeNo 呢? tradeNo :当用户完成支付行为时,可以获取 tradeNo(即支付交易号) 用于 发送交易类模板消息,如 小程序支付 中的 alipay.trade.create 或 资金授权 以及 当面付 中的 alipay.trade.pay 接口。消息类型为支付类型的只能通过 tradeNo 发送。 上述几个功能的对接文档在此列出,感兴趣的同学可以课后查看哦。需要注意的 是,目前这几大功能仅对企业支付宝账号开放;个人账号暂时无法完成对接。  小程序支付:https://opendocs.alipay.com/mini/introduce/pay  当面付:https://opendocs.alipay.com/open/194/105072/  资金授权:https://opendocs.alipay.com/mini/introduce/pre-authorization 109 缘遂:小程序二维码 “现在到处都是二维码,逼死强迫症哦。忍不住想扫扫看,哈哈哈。” “我这边也有个码,你扫了试试?” “什么二维码啊,这么神秘。扫开了还加载这么久。” “......” “啊,谢谢你。” 夕阳照在小美的脸上,越发得红了。 产品介绍 概述 使用本能力可生成小程序二维码,商户可将生成后的小程序二维码在线上线下进行 贴码推广,更便捷地推广小程序。 产品特色 每个小程序都有一个默认的小程序二维码,目标地址是 小程序首页。  创建 20 个以内小程序二维码。在 开发中心 > 小程序应用 > 我的小程序 中点击已创建 的小程序名称,进入小程序详情页面,左侧目录栏中选择 码管理 > 小程序码。  创建超过 20 个小程序二维码。通过调用二维码接口 alipay.open.app.qrcode.create 实现,一个小程序可通过使用该二维码接口获取无限个带参数的二维码。 页面地址获取方式 小程序页面地址可通过开发者工具在代码中的 app.json 中的 onShow 和 onLaunch 中获取。 110 使用说明 支付宝扫描二维码将按以下匹配规则控制跳转:  页面地址:指定小程序中能访问的路径地址,默认为小程序的首页地址。  启动参数:小程序启动时候需要带入的参数,可以为空。启动参数可以通过 options.query 获取,格式为 key1=value1&key2=value2。 示例代码 准备获取启动参数中 x 的值。 App({ onLaunch(options) { my.alert({content: '启动参数:'+JSON.stringify(options.query.x),}); console.log('query', options.query); console.log('App Launch', options); }, onShow() { console.log('App Show') }, onHide() { console.log('App Hide') }, globalData: { hasLogin: false } }) 输入参数 页面地址:page/component/component-pages/view/view 启动参数:x=1&y=2 示例效果: 111 准入条件 小程序开发者均可使用。 计费模式 不收费。 API 列表 接口名称 描述 alipay.open.app.qrcode.create 小程序生成推广二维码接口 快速接入 DEMO 支付宝开放平台还为开发者提供了小程序二维码 DEMO,开发者可以参考 快速示 例 文档进行体验和实现快速接入。 内容来源:https://developer.aliyun.com/article/756818?spm=a2c6h.12873581.0.dArticle756818.26162b70Su1GZy&groupCode=tech_library
KaFei 2020-04-27 15:46:58 0 浏览量 回答数 0

问题

软件开发外包中的软件订制

软件开发外包中的软件订制 “软件定制”在国外是为大、中、小公司所广泛采用的一种软件开发形式,在我国,由于经济环境和传统管理方式的不同,定制软件还是一种新生事物。定际上,大多数企业由于自...
大大神 2019-12-01 21:18:40 1875 浏览量 回答数 0

回答

如果能时光倒流,回到过去,作为一个开发人员,你可以告诉自己在职业生涯初期应该读一本, 你会选择哪本书呢。我希望这个书单列表内容丰富,可以涵盖很多东西。” 1、《代码大全》 史蒂夫·迈克康奈尔 推荐数:1684 “优秀的编程实践的百科全书,《代码大全》注重个人技术,其中所有东西加起来, 就是我们本能所说的“编写整洁的代码”。这本书有50页在谈论代码布局。” —— Joel Spolsky 对于新手来说,这本书中的观念有点高阶了。到你准备阅读此书时,你应该已经知道并实践过书中99%的观念。– esac Steve McConnell的原作《代码大全》(第1版)是公认的关于编程的最佳实践指南之一, 在过去的十多年间,本书一直在帮助开发人员编写更好的软件。 现在,作者将这本经典著作全新演绎,融入了最前沿的实践技术,加入了上百个崭新的代码示例, 充分展示了软件构建的艺术性和科学性。 McConnell汇集了来自研究机构、学术界以及业界日常实践的主要知识, 把最高效的技术和最重要的原理交织融会为这本既清晰又实用的指南。 无论您的经验水平如何,也不管您在怎样的开发环境中工作,也无论项目是大是小, 本书都将激发您的思维并帮助您构建高品质的代码。 《代码大全(第2版))》做了全面的更新,增加了很多与时俱进的内容,包括对新语言、新的开发过程与方法论的讨论等等。 2、《程序员修炼之道》 推荐数:1504 对于那些已经学习过编程机制的程序员来说,这是一本卓越的书。 或许他们还是在校生,但对要自己做什么,还感觉不是很安全。 就像草图和架构之间的差别。虽然你在学校课堂上学到的是画图,你也可以画的很漂亮, 但如果你觉得你不太知道从哪儿下手,如果某人要你独自画一个P2P的音乐交换网络图,那这本书就适合你了。—— Joel 《程序员修炼之道:从小工到专家》内容简介:《程序员修炼之道》由一系列独立的部分组成, 涵盖的主题从个人责任、职业发展,知道用于使代码保持灵活、并且易于改编和复用的各种架构技术, 利用许多富有娱乐性的奇闻轶事、有思想性的例子及有趣的类比, 全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。 无论你是初学者,是有经验的程序员,还是软件项目经理,《程序员修炼之道:从小工到专家》都适合你阅读。 3、《计算机程序的构造和解释》 推荐数:916 就个人而言,这本书目前为止对我影响醉倒的一本编程书。 《代码大全》、《重构》和《设计模式》这些经典书会教给你高效的工作习惯和交易细节。 其他像《人件集》、《计算机编程心理学》和《人月神话》这些书会深入软件开发的心理层面。 其他书籍则处理算法。这些书都有自己所属的位置。 然而《计算机程序的构造和解释》与这些不同。 这是一本会启发你的书,它会燃起你编写出色程序的热情; 它还将教会你认识并欣赏美; 它会让你有种敬畏,让你难以抑制地渴望学习更多的东西。 其他书或许会让你成为一位更出色的程序员,但此书将一定会让你成为一名程序员。 同时,你将会学到其他东西,函数式编程(第三章)、惰性计算、元编程、虚拟机、解释器和编译器。 一些人认为此书不适合新手。 个人认为,虽然我并不完全认同要有一些编程经验才能读此书,但我还是一定推荐给初学者。 毕竟这本书是写给著名的6.001,是麻省理工学院的入门编程课程。 此书或许需要多做努力(尤其你在做练习的时候,你也应当如此),但这个价是对得起这本书的。 4、《C程序设计语言》 推荐数:774 这本书简洁易读,会教给你三件事:C 编程语言;如何像程序员一样思考;底层计算模型。 (这对理解“底层”非常重要)—— Nathan 《C程序设计语言》(第2版新版)讲述深入浅出,配合典型例证,通俗易懂,实用性强, 适合作为大专院校计算机专业或非计算机专业的C语言教材,也可以作为从事计算机相关软硬件开发的技术人员的参考书。 《C程序设计语言》(第2版新版)原著即为C语言的设计者之一Dennis M.Ritchie和著名的计算机科学家Brian W.Kernighan合著的 一本介绍C语言的权威经典著作。 我们现在见到的大量论述C语言程序设计的教材和专著均以此书为蓝本。 原著第1版中介绍的C语言成为后来广泛使用的C语言版本——标准C的基础。 人们熟知的“hello,world”程序就是由本书首次引入的,现在,这一程序已经成为所有程序设计语言入门的第一课。 5、《算法导论》 推荐数:671 《代码大全》教你如何正确编程; 《人月神话》教你如何正确管理; 《设计模式》教你如何正确设计…… 在我看来,代码只是一个工具,并非精髓。 开发软件的主要部分是创建新算法或重新实现现有算法。 其他部分则像重新组装乐高砖块或创建“管理”层。 我依然梦想这样的工作,我的大部分时间(>50%)是在写算法,其他“管理”细节则留给其他人…… —— Ran Biron 经典的算法书,被亚马逊网,《程序员》等评选为2006年最受读者喜爱的十大IT图书之一。 算法领域的标准教材,全球多所知名大学选用 MIT名师联手铸就,被誉为“计算机算法的圣经” 编写上采用了“五个一”,即一章介绍一个算法、一种设计技术、一个应用领域和一个相关话题。 6、《重构:改善既有代码的设计》 推荐数:617 《重构:改善既有代码的设计》清晰地揭示了重构的过程,解释了重构的原理和最佳实践方式, 并给出了何时以及何地应该开始挖掘代码以求改善。 书中给出了70多个可行的重构,每个重构都介绍了一种经过验证的代码变换手法的动机和技术。 《重构:改善既有代码的设计》提出的重构准则将帮助你一次一小步地修改你的代码,从而减少了开发过程中的风险。 《重构:改善既有代码的设计》适合软件开发人员、项目管理人员等阅读, 也可作为高等院校计算机及相关专业师生的参考读物。 我想我不得不推荐《重构》:改进现有代码的设计。—— Martin 我必须承认,我最喜欢的编程语录是出自这本书:任何一个傻瓜都能写出计算机能理解的程序, 而优秀的程序员却能写出别人能读得懂的程序。—— Martin Fowler 7、《设计模式》 推荐数:617 自1995年出版以来,本书一直名列Amazon和各大书店销售榜前列。 近10年后,本书仍是Addison-Wesley公司2003年最畅销的图书之一。 中文版销售逾4万册。 就我而言,我认为四人帮编著的《设计模式》是一本极为有用的书。 虽然此书并不像其他建议一样有关“元”编程,但它强调封装诸如模式一类的优秀编程技术, 因而鼓励其他人提出新模式和反模式(antipatterns),并运用于编程对话中。—— Chris Jester-Young 8、《人月神话》 推荐数:588 在软件领域,很少能有像《人月神话》一样具有深远影响力并且畅销不衰的著作。 Brooks博士为人们管理复杂项目提供了最具洞察力的见解。 既有很多发人深省的观点,又有大量软件工程的实践。 本书内容来自Brooks博士在IBM公司System/360家族和OS/360中的项目管理经验。 该书英文原版一经面世,即引起业内人士的强烈反响,后又译为德、法、日、俄中等多种语言,全球销量数百万册。 确立了其在行业内的经典地位。 9、《计算机程序设计艺术》 推荐数:542 《计算机程序设计艺术》系列著作对计算机领域产生了深远的影响。 这一系列堪称一项浩大的工程,自1962年开始编写,计划出版7卷,目前已经出版了4卷。 《美国科学家》杂志曾将这套书与爱因斯坦的《相对论》等书并列称为20世纪最重要的12本物理学著作。 目前Knuth正将毕生精力投入到这部史诗性著作的撰写中。 这是高德纳倾注心血写的一本书。—— Peter Coulton 10、《编译原理》(龙书) 推荐数:462 我很奇怪,居然没人提到龙书。(或许已有推荐,我没有看到)。 我从没忘过此书的第一版封面。 此书让我知道了编译器是多么地神奇绝妙。- DB 11、《深入浅出设计模式》 推荐数:445 强大的写作阵容。 《Head First设计模式》(中文版) 作者Eric Freeman; ElElisabeth Freeman是作家、讲师和技术顾问。 Eric拥有耶鲁大学的计算机科学博士学位,E1isabath拥有耶鲁大学的计算机科学硕士学位。 Kathy Sierra(javaranch.com的创始人)FHBert Bates是畅销的HeadFirst系列书籍的创立者,也是Sun公司Java开发员认证考试的开发者。 本书的产品设计应用神经生物学、认知科学,以及学习理论,这使得这本书能够将这些知识深深地印在你的脑海里, 不容易被遗忘。 本书的编写方式采用引导式教学,不直接告诉你该怎么做,而是利用故事当作引子,带领读者思考并想办法解决问题。 解决问题的过程中又会产生一些新的问题,再继续思考、继续解决问题,这样可以加深体会。 作者以大量的生活化故事当背景,例如第1章是鸭子,第2章是气象站,第3章是咖啡店, 书中搭配大量的插图(几乎每一页都有图),所以阅读起来生动有趣,不会感觉到昏昏欲睡。 作者还利用歪歪斜斜的手写字体,增加“现场感”。 精心设计许多爆笑的对白,让学习过程不会太枯燥。 还有模式告白节目,将设计模式拟人化成节目来宾,畅谈其内在的一切。 每一章都有数目不等的测验题。 每章最后有一页要点整理,这也是精华所在,我都是利用这一页做复习。 我知道四人帮的《设计模式》是一本标准书,但倒不如先看看这部大部头,此书更为简易。 一旦你了解了解了基本原则,可以去看四人帮的那本圣经了。- Calanus 12、《哥德尔、艾舍尔、巴赫书:集异璧之大成》 推荐数:437 如果下昂真正深入阅读,我推荐道格拉斯·侯世达(Douglas Hofstadter)的《哥德尔、艾舍尔、巴赫书》。 他极为深入研究了程序员每日都要面对的问题:递归、验证、证明和布尔代数。 这是一本很出色的读物,难度不大,偶尔有挑战,一旦你要鏖战到底,将是非常值得的。 – Jonik 13、《代码整洁之道》 推荐数:329 细节之中自有天地,整洁成就卓越代码 尽管糟糕的代码也能运行,但如果代码不整洁,会使整个开发团队泥足深陷, 写得不好的代码每年都要耗费难以计数的时间和资源。 然而这种情况并非无法避免。 著名软件专家RoberfC.Marlin在《代码整洁之道》中为你呈现出了革命性的视野。 Martin携同ObjectMetltor公司的同事,从他们有关整洁代码的最佳敏捷实践中提炼出软件技艺的价值观, 以飨读者,让你成为更优秀的程序员——只要你着手研读《代码整洁之道》。 阅读《代码整洁之道》需要你做些什么呢。你将阅读代码——大量代码。 《代码整洁之道》促使你思考代码中何谓正确,何谓错误。 更重要的是,《代码整洁之道》将促使你重新评估自己的专业价值观,以及对自己技艺的承诺。 从《代码整洁之道》中可以学到: 好代码和糟糕的代码之间的区别; 如何编写好代码,如何将糟糕的代码转化为好代码; 如何创建好名称、好函数、好对象和好类; 如何格式化代码以实现其可读性的最大化; 如何在不妨碍代码逻辑的前提下充分实现错误处理; 如何进行单元测试和测试驱动开发。 虽然《代码整洁之道》和《代码大全》有很多共同之处,但它有更为简洁更为实际的清晰例子。 – Craig P. Motlin 14、《Effective C++》和《More Effective C++》 推荐数:297 在我职业生涯早期,Scott Meyer的《Effective C++》和后续的《More Effective C++》都对我的编程能力有着直接影响。 正如当时的一位朋友所说,这些书缩短你培养编程技能的过程,而其他人可能要花费数年。 去年对我影响最大的一本书是《大教堂与市集》,该书教会我很有关开源开发过程如何运作,和如何处理我代码中的Bug。 – John Channing 15、《编程珠玑》 推荐数:282 多年以来,当程序员们推选出最心爱的计算机图书时,《编程珠玑》总是位列前列。 正如自然界里珍珠出自细沙对牡蛎的磨砺,计算机科学大师Jon Bentley以其独有的洞察力和创造力, 从磨砺程序员的实际问题中凝结出一篇篇不朽的编程“珠玑”, 成为世界计算机界名刊《ACM通讯》历史上最受欢迎的专栏, 最终结集为两部不朽的计算机科学经典名著,影响和激励着一代又一代程序员和计算机科学工作者。 本书为第一卷,主要讨论计算机科学中最本质的问题:如何正确选择和高效地实现算法。 尽管我不得不羞愧地承认,书中一半的东西我都没有理解,但我真的推荐《编程珠玑》,书中有些令人惊奇的东西。 – Matt Warren 16、《修改代码的艺术》by Michael Feathers 本书是继《重构》和《重构与模式》之后探讨修改代码技术的又一里程碑式的著作, 而且从涵盖面和深度上都超过了前两部经典。 书中不仅讲述面向对象语言(Java、C#和C++)代码,也有专章讨论C这样的过程式语言。 作者将理解、测试和修改代码的原理、技术和最新工具(自动化重构工具、单元测试框架、仿对象、集成测试框架等), 与解依赖技术和大量开发和设计优秀代码的原则、最佳实践相结合,许多内容非常深入,而且常常发前人所未发。 书中处处体现出作者独到的洞察力,以及多年开发和指导软件项目所积累的丰富经验和深厚功力。 通过这部集大成之作,你不仅能掌握最顶尖的修改代码技术,还可以大大提高对代码和软件开发的领悟力。 我认为没有任何一本书能向这本书一样影响了我的编程观点。 它明确地告诉你如何处理其他人的代码,含蓄地教会你避免哪些(以及为什么要避免)。- Wolfbyte 同意。很多开发人员讨论用干净的石板来编写软件。 但我想几乎所有开发人员的某些时候是在吃其他开发人员的狗食。– Bernard Dy 17、《编码:隐匿在计算机软硬件背后的语言》 这是一本讲述计算机工作原理的书。 不过,你千万不要因为“工作原理”之类的字眼就武断地认为,它是晦涩而难懂的。 作者用丰富的想象和清晰的笔墨将看似繁杂的理论阐述得通俗易懂,你丝毫不会感到枯燥和生硬。 更重要的是,你会因此而获得对计算机工作原理较深刻的理解。 这种理解不是抽象层面上的,而是具有一定深度的,这种深度甚至不逊于“电气工程师”和“程序员”的理解。 不管你是计算机高手,还是对这个神奇的机器充满敬畏之心的菜鸟, 都不妨翻阅一下《编码:隐匿在计算机软硬件背后的语言》,读一读大师的经典作品,必然会有收获。 我推荐Charles Petzold的《编码》。 在这个充满工具和IDE的年代,很多复杂度已经从程序员那“抽取”走了,这本书一本开眼之作。 – hemil 18、《禅与摩托车维修艺术 / Zen and the Art of Motorcycle Maintenance》 对我影响最大的那本书是 Robert Pirsig 的《禅与摩托车维修艺术》。 不管你做什么事,总是要力求完美,彻底了解你手中的工具和任务,更为重要的是, 要有乐趣(因为如果你做事有乐趣,一切将自发引向更好的结果)。 – akr 19、《Peopleware / 人件集:人性化的软件开发》 Demarco 和 Lister 表明,软件开发中的首要问题是人,并非技术。 他们的答案并不简单,只是令人难以置信的成功。 第二版新增加了八章内容。 – Eduardo Molteni 20、《Coders at Work / 编程人生》 这是一本访谈笔录,记录了当今最具个人魅力的15位软件先驱的编程生涯。 包括DonaldKnuth、Jamie Zawinski、Joshua Bloch、Ken Thompson等在内的业界传奇人物,为我们讲述了 他们是怎么学习编程的,在编程过程中发现了什么以及他们对未来的看法, 并对诸如应该如何设计软件等长久以来一直困扰很多程序员的问题谈了自己的观点。 一本非常有影响力的书,可以从中学到一些业界顶级人士的经验,了解他们如何思考并工作。 – Jahanzeb Farooq 21、《Surely You’re Joking, Mr. Feynman! / 别闹了,费曼先生。》 虽然这本书可能有点偏题,但不管你信不信,这本书曾在计算机科学专业课程的阅读列表之上。 一个优秀的角色模型,一本有关好奇心的优秀书籍。 – mike511 22、《Effective Java 中文版》 此书第二版教你如何编写漂亮并高效的代码,虽然这是一本Java书,但其中有很多跨语言的理念。 – Marcio Aguiar 23、《Patterns of Enterprise Application Architecture / 企业应用架构模式》 很奇怪,还没人推荐 Martin Fowler 的《企业应用架构模式》- levi rosol 24、《The Little Schemer》和《The Seasoned Schemer》 nmiranda 这两本是LISP的英文书,尚无中文版。 美国东北大学网站上也有电子版。 25、《交互设计之路》英文名:《The Inmates Are Running The Asylum: Why High Tech Products Drive Us Crazy and How to Restore the Sanity》该书作者:Alan Cooper,人称Visual Basic之父,交互设计之父。 本书是基于众多商务案例,讲述如何创建更好的、高客户忠诚度的软件产品和基于软件的高科技产品的书。 本书列举了很多真实可信的实际例子,说明目前在软件产品和基于软件的高科技产品中,普遍存在着“难用”的问题。 作者认为,“难用”问题是由这些产品中存在着的高度“认知摩擦”引起的, 而产生这个问题的根源在于现今软件开发过程中欠缺了一个为用户利益着想的前期“交互设计”阶段。 “难用”的产品不仅损害了用户的利益,最终也将导致企业的失败。 本书通过一些生动的实例,让人信服地讲述了由作者倡导的“目标导向”交互设计方法在解决“难用”问题方面的有效性, 证实了只有改变现有观念,才能有效地在开发过程中引入交互设计,将产品的设计引向成功。 本书虽然是一本面向商务人员而编写的书,但也适合于所有参与软件产品和基于软件的高科技产品开发的专业人士, 以及关心软件行业和高科技行业现状与发展的人士阅读。 他还有另一本中文版著作:《About Face 3 交互设计精髓》 26、《Why’s (Poignant) Guide to Ruby 》 如果你不是程序员,阅读此书可能会很有趣,但如果你已经是个程序员,可能会有点乏味。 27、《Unix编程艺术》 It is useful regardless operating system you use. – J.F. Sebastian 不管你使用什么操作系统,这本书都很有用。 – J.F. Sebastian 28、《高效程序员的45个习惯:敏捷开发修炼之道》 45个习惯,分为7个方面:工作态度、学习、软件交付、反馈、编码、调试和协作。 每一个具体的习惯里,一开始提出一个谬论,然后展开分析,之后有正队性地提出正确的做法,并设身处地地讲出了正确做法给你个人的“切身感受”,最后列出几条注意事项,帮助你修正自己的做法(“平衡的艺术”)。 29、《测试驱动开发》 前面已经提到的很多书都启发了我,并影响了我,但这本书每位程序员都应该读。 它向我展示了单元测试和TDD的重要性,并让我很快上手。 – Curro 我不关心你的代码有多好或优雅。 如果你没有测试,你或许就如同没有编写代码。 这本书得到的推荐数应该更高些。 人们讨论编写用户喜欢的软件,或既设计出色并健壮的高效代码,但如果你的软件有一堆bug,谈论那些东西毫无意义。– Adam Gent 30、《点石成金:访客至上的网页设计秘笈》 可用性设计是Web设计中最重要也是难度最大的一项任务。 《点石成金-访客至上的网页设计秘笈(原书第二版)》作者根据多年从业的经验,剖析用户的心理, 在用户使用的模式、为扫描进行设计、导航设计、主页布局、可用性测试等方面提出了许多独特的观点, 并给出了大量简单、易行的可用性设计的建议。 本书短小精炼,语言轻松诙谐,书中穿插大量色彩丰富的屏幕截图、趣味丛生的卡通插图以及包含大量信息的图表, 使枯燥的设计原理变得平易近人。 本书适合从事Web设计和Web开发的技术人员阅读,特别适合为如何留住访问者而苦恼的网站/网页设计人员阅读。 这是一本关于Web设计原则而不是Web设计技术的书。 本书作者是Web设计专家,具有丰富的实践经验。 他用幽默的语言为你揭示Web设计中重要但却容易被忽视的问题,只需几个小时, 你便能对照书中讲授的设计原则找到网站设计的症结所在,令你的网站焕然一新。
青衫无名 2019-12-02 01:20:04 0 浏览量 回答数 0

问题

软件项目的用户验收测试

       随着当今技术和市场环境的变化,越来越多的企业选择将软件项目外包,同时也有更多成熟的大型软件企业加入到软件项目的承包队伍中。外包的软件项目越来越多,如何对这些外包的项目进行验收测试日益成...
技术小菜鸟 2019-12-01 21:47:00 4292 浏览量 回答数 1

问题

九个衡量Rails应用性能的小方法

你有个绝佳的商业创意,日复一日地将它完善丰满起来。后来,你雇了一群天赋异禀的开发者、Web 设计师和用户体验专家,他们用一种非常棒的框架——Ruby on Rails 帮你实现长久以来的梦想。 ...
doudou1 2019-12-01 22:09:09 9032 浏览量 回答数 1

问题

Java安全编码:糟糕的在线建议和令人困惑的APIs

对于程序员和软件开发人员来说,网络论坛提供了一个交流知识和寻找具体编码难题的好地方。遗憾的是,他们并不总是准确信息的来源。 弗吉尼亚理工大学的一组研究人员分析了数百篇关于 Stack Overflow的文章&...
移动安全 2019-12-01 21:31:32 1891 浏览量 回答数 0

回答

01. 前言 关于程序员接私活,社会各界说法不一。按照作者的观点来说如果你确实急用钱,价格又合适,那就去做。如果不怎么缺钱,那就接私活之前要好好考虑。私活的钱不好挣是一个方面,更重要的是如果你把做私活的时间花在提升自己上,产生的价值就要大得多。等你提升了自己,提升了固定薪水,远比拿的这点私活的钱划算。千万不要“捡了芝麻丢了西瓜”。 如果你主业上遇到了瓶颈,平时的时间比较充分,想有一些额外的收入,同时为了保持技术的熟练度,这种情况下,是可以考虑接一些私活的。对于那种投入时间巨大,回报很可怜的项目,千万不要接。 下面介绍一些常用的平台可以接私活。 02. 程序员客栈 程序员客栈中国非常领先的自由工作平台,为中高端程序员、产品经理和设计师等等互联网相关人员提供稳定的线上工作机会,包括自由工作、远程工作和兼职工作,还支持按需雇佣,工作模式非常多,感兴趣的推荐大家尝试一下。虽然名称叫程序员客栈,但是除了程序员,像产品经理,设计师等等互联网相关人员,都能在上面找到适合自己的项目。感兴趣的可以体验一下。 程序员客栈官网:https://www.proginn.com/ 03. 码市 码市是 Coding 推出的互联网软件外包服务平台,意在连接需求方与广大开发者。让项目的需求方快速的找到合适的开发者,完成项目开发工作。 码市官方网站:https://codemart.com/ 04. 猪八戒网 猪八戒网创建于2006年,是服务中小微企业的人才共享平台。开创式地为人才与雇主搭建起双边市场,通过线上线下资源整合与大数据服务,实现人才与雇主精准无缝对接。找兼职的地方,主要是入门级项目,不适合专业程序员,只适合新手。 猪八戒官网:https://luoyang.zbj.com/ 05. 开源众包 开源众包–专业的软件众包平台,350万+ 优质开发者为您提供网站、APP、微信/小程序、企业应用等软件开发服务,有效降低企业 IT 软件开发成本、解决技术资源不足等问题。 开源中国的众包平台,主要是以众包为主。 开源众包官网:https://zb.oschina.net/ 06. 智城外包网 智城外包网,聚合全国软件团队资源,官方认证,1小时响应,零交易佣金,托管安全保障。十年口碑运营,万家靠谱团队。免费比价,免费一站式外包项目管理工具。平台汇集软件咨询专家,软件技术专家,软件开发专家,软件开发公司,软件外包公司,软件外派公司。在线竞标模式,让IT外包项目和短期IT招聘、人力派遣需求可以获得高性价比的候选。海量资源池包括:网站设计、网站开发、手机应用开发、移动应用开发、安卓应用开发、苹果应用开发、微信应用开发、Java技术、C#技术、Web前端开发、IT人力外包、IT人力外派、IT人力短期招聘、技术合伙人、通用软件开发,SaaS软件实施,软件运维等服务门类。 网官方网站:http://www.taskcity.com/ 07. 实现网 北京实现与爱科技有限公司是一个互联网工程师兼职平台。解决创业公司招人难、成本高的问题。 创业公司通过实现网可以快速预约知名互联网企业的工程师、设计师到自己的团队工作。上午预约工程师,最快晚上即可到班兼职。 互联网工程师可以在实现网注册成为技术顾问,利用业余时间助力创业公司,并且获得以时薪为单位的报酬。 目前已有9000+工程师或设计师可在线预约和支付,支付后工程师会到团队里坐班沟通,快速推进创业者的产品开发进度。 实现网为企业提供BAT等名企背景的、靠谱的开发设计兼职人才和自由职业者,满足企业项目外包、驻场开发、远程兼职、技术咨询等短期人力需求。已服务2000多家企业,包括好未来、方正、人人贷、秒拍等知名企业。 官方网站:https://shixian.com/ 08. 猿急送 猿急送,一个高级技术共享平台,这里汇聚知名互联网公司的技术、设计、产品大牛,通过实际坐班、远程等方式,一对一为创业公司解决问题,提高创业效率。 猿急送为您提供兼职程序员,兼职工程师信息,猿急送是一个高级技术共享平台,是优质的程序员兼职网站,这里汇聚BAT等知名互联网公司的技术开发、产品、设计大牛,通过实际坐班等方式,一对一为创业公司解决程序员、工程师等开发、产品设计人力问题。 官方网站:https://www.yuanjisong.com/ 09. 人人开发 人人开发基于可视化快速开发平台 - 捷得(Joget)/捷得云(Joget Cloud)(PaaS),集众多开发者资源,为企业提供企业管理软件服务。应用市场提供应用产品、插件的在线试用和销售,服务市场以威客众包模式提供管理软件定制开发服务,各类企业级应用开发服务,例如:协同OA产品,ERP,CRM,人事管理,项目管理,资产管理,设备管理等。 官方网站:http://rrkf.com/ 10. 开发邦 公司位于北京中关村科技园区核心区海淀园,成立于2010年,专注于为客户提供互联网软件技术开发与咨询服务,致力于利用互联网软件技术为客户提高效率、降低成本、提升效能、优化管理。 团队核心成员均具有十年以上软件互联网技术开发经验,毕业于工科名校。至今,已成功执行近百个项目,涵盖管理软件、互联网系统、移动APP、前端互动开发等。 先后为华为公司、商汤科技、工信部中国软件评测中心、神州数码、深鉴科技、中软集团、中国万网、中石油吐哈气举中心、华北电力大学、中科院科技政策与管理研究所、浪潮集团、ADI、世界五百强伊顿中国、北京外国语大学、51talk、勤邦生物、安龙基因等知名企业及机构提供过互联网软件技术开发与技术咨询服务。 开发邦致力于成为企业业务互联网软件服务与咨询的定制方案提供商。 官方网站:https://www.kaifabang.com/ 11. 电鸭社区 电鸭社区旨在帮助更多人走上「只工作,不上班」的自由工作之路,我们是一个「分布式组织」,通过分享及行动带来积极的影响,相信点滴的力量能改变潮水的方向。 官方网站:https://eleduck.com/ 12. 快码 深圳快码科技成立于2014年11月,是一家创新型的互联网公司,致力于通过创新的开发方式,为软件技术开发行业带来改变,提供更快速、更高性价比的软件定制服务。 “快码”的意思是“快速编写代码”。公司采用“专属项目经理 + 自有开发团队 + 平台程序员”的创新开发方式,严格按照互联网公司的标准来管理开发团队,确保每个项目都有充足的人员投入,确保项目的进度和开发质量。2015年,我们和全球最大的手游、APP云测试平台Testin达成战略合作协议,并获得Testin数百万的战略投资。 目前平台已注册的开发者达到3万多人,涵盖各种开发语言与类型,可以提供开发的项目有iOS APP、安卓APP、微信公众号、PC网站、手机网站、微信小程序、桌面软件、智能硬件APP等。上线以来,我们已经完成了数千项目&任务的开发。 创业灵感来自于快码团队的从业经验。在近十年的互联网技术经历中,对由于创业公司、外包公司人员不稳定,招聘困难、人手有限等问题而导致现有团队开发任务过重,开发进度缓慢等问题有着切身之痛,将在P2P旅游行业2年多的共享经济经验,和自身最熟悉的“软件开发”结合,创立了“快码”。 快码将立足于代码开发,深耕行业,面向未来,通过持续的产品创新,为广大项目方、开发者提供专业的服务,为软件技术开发行业带来改变。 快码是一个创新的软件开发平台。项目方可以更省钱、高效地完成项目的开发;开发者可以充分利用闲置时间,实现更高的商业价值! 官方网站:https://www.kuai.ma/ 13. 英选 英选,可信赖的软件外包服务。用优秀的人,做漂亮的产品,写干净的代码。平台以定制开发外包服务为主,也是外包项目平台。 官方网站:https://www.yingxuan.io/ 14. Upwork Upwork 是全球最大的、最优秀的、最规范的综合类人力外包服务平台,由著名的 Elance 和 oDesk 合并。这里聚集 900 万来自全球各地的自由工作者,你肯定可以在找到适合你的职位。 官方网站:https://www.upwork.com/ 15. Freelancer Freelancer 的工作类型覆盖了很多不同的领域,由程序开发到市场营销、广告、会计、法务等一系列的可以远程的工作。 官方网站:https://www.freelance.com/ 16. Dribbble Dribbble 不只是全球最受欢迎的设计师社区,同样是设计师寻找远程工作的好出处。自从被 Tiny 收购后,Dribbble 的招聘属性正在慢慢增强,试着持续 PO 出自己的好作品,等待你的伯乐,同样你可以关注 Jobs 页面,给心仪的 Team 提交简历。 官方网站:https://dribbble.com/jobs 17. Remoteok Remoteok 不仅提供最初的兼职类远程工作,还有全职类,签署合同类和实习类的工作。网站创始人 Pieter Levels 本身就是一名数字游民,他同样是 Nomadlist 的创始人。 官方网站:https://remoteok.io/ 18. Toptal Toptal 是一个高端一些的自由职业者平台,适合比较有经验和工作尽力的远程工作者。它将企业与全球的软件工程师,设计师和业务顾问联系起来。 官方网站:https://www.toptal.com/ 19. AngelList AngelList 主要是服务于初创公司和天使投资人的平台,这里还有初创公司提供的远程工作的机会,如果对远程加入初创公司感兴趣的,可以尝试一下。 官方网站:https://angel.co/remote 20. Topcoder Topcoder 通过算法比赛吸引世界顶级的程序员,他会将一下大型项目分割成很多小模块,通过竞赛的模式交给用户来做,优胜者可以拿到制定模块的奖金。 官方网站:https://www.topcoder.com/
茶什i 2020-01-15 11:55:41 0 浏览量 回答数 0

问题

ios9字体、阿里云oss、个人企业域名备案等常见问题和答案汇总

ios9字体、阿里云oss、个人企业域名备案等常见问题和答案汇总 1、Windows Server 下安装 SQL Server 2016 —— SMSS Windows Server 下安装 SQL Server 2016三步曲&#x...
问问小秘 2020-01-02 10:31:59 36 浏览量 回答数 1

问题

企业运营对DevOps的「傲慢与偏见」

摘要:出于各种原因,并非所有人都信任 DevOps 。有些人觉得 DevOps 只不过给开发者改善产品提供了一个途径而已,还有的人觉得 DevOps 是一堆悦耳的空头支票,甚至有人认为...
忆远0711 2019-12-01 21:32:29 9823 浏览量 回答数 0

回答

虽然跨平台的移动APP开发有利有弊。但从业务初创的角度来看,优点应该是大于缺点的。而且,随着对跨平台移动应用需求的不断增长,现在可用的工具和框架数量也已经很可观了。 但选择过多会令人头疼,这就是为什么我们只关注最突出的跨平台移动开发框架的原因:React Native, Flutter, NativeScript, 和Xamarin。 为了让你更深入地了解是什么使这些工具成为2020年软件开发的可选选项,我们将根据以下标准对它们进行打分:社区支持、基于的编程语言、代码可重用性、性能、界面以及使用它们构建的重要应用程序。 React Native Reaction Native是Facebook于2015年发布的开源、跨平台的应用开发框架。作为2013年举办的一场内部黑客马拉松的产物,它已经成为最受欢迎的原生App开发替代方案之一,拥有2043名GitHub贡献者,获得了超过82900 GitHub标星。不断增长的社区认知度使得找到一支可靠且经验丰富的开发团队来承接你的项目变得相对容易。 Learn Once and Write Anywhere 基于React.JS,React Native利用JavaScript(根据2019年Stack Overflow的调查,JavaScript成为了最受欢迎的编程语言),为Android和iOS用户提供真正原生的应用外观和体验。另外,使该框架脱颖而出的是,如果你需要,React Native允许你使用Java、Objective-C或SWIFT编写部分原生模块来顺利处理复杂的操作,如视频播放或图像编辑。 虽然这些组件不能在不同的平台之间共享,并且需要开发人员做更多的工作,但多达90%的React Native代码是可以重用的。很好地表明该框架的座右铭不是“Write Once, Use Anywhere”,而是“learn once, write anywhere”。 就GUI而言,React Native可以提供接近原生的用户体验,这要归功于它使用了Android和iOS的本地控制器。它还使用带有UI元素的ReactJS库,这有助于加快UI设计过程。在开发移动应用程序时,使此框架值得考虑的另一个原因是,它可用在不丢失应用程序状态的情况下对UI进行更改。 另一个使React Native成为2020年跨平台移动开发框架的首选之一,是因为持续的更新,例如近期的版本 0.60 和 0.61 : 多项辅助功能改进。 更清晰、更人性化的开始屏幕。 快速刷新,融合了实时和热重新加载,从而显著加快了开发进程。 如上的Release Note只是React Native适应不断变化的需求其中一个很小的样本。 2020年值得考虑的第二个框架是Flutter。它在Google I/O 2017上宣布,并于2018年发布,对于跨平台的世界来说,它现在仍然是一个“新人”。但尽管如此,它已经获得了超过80500 GitHub星标和绝大多数工程师将其称为2019年Stack Overflow调查中最受欢迎的三个框架之一,Flutter无疑是一股不可忽视的力量。 Dart是如何使Flutter变得独一无二的 Flutter 背后的编程语言是 Dart,谷歌称之为"客户端优化",适合在任何平台上"快速构建应用程序"。它于 2011 年推出,是一种响应式面向对象的语言,被开发者认为相对容易学习,其中原因有二:第一,语法上它借鉴了C/C++ 和 Java; 第二,在官方网站上,您可以找到内容广泛且相当简单的文档。值得一提的是,Dart 附带了大量Flutter 兼容软件包的软件包,允许您使应用程序更加复杂。 lutter的一个主要优势是,它的性能比本文提到的任何其他跨平台移动开发框架都要好。这归功于Dart的编译器和Flutter拥有自己的一套小部件。结果是它能更快、更直接地与平台直接通信,而不需要JavaScript桥(例如,Reaction Native就是这种情况)。说到小部件:通过Flutter的“UI-as-a-code”方法,它们只用DART编写,这就提高了代码的可重用性。 效率与用户体验和界面密不可分。如前所述,Flutter不依赖于一组原生组件,而是利用可视化、结构化、平台性和交互式小部件进行UI的设计,所有这些都由框架的图形引擎呈现。更重要的是,Flutter留下了很大的定制空间,如果你想要设计一个很完美的UI,它是个很好的选择。 说到Flutter的更新,最新的稳定版本是在12月12日发布的,根据官方发布说明,它合并了来自188个贡献者的近2000个pull。例如,版本1.12.13中包括的改进: 重大的API变动。 新功能,例如SliverOpacity小部件和SliverAnimatedList。 修复了崩溃和性能问题。 Beta版中的Web支持。 这不是一个完整的清单,因为Flutter的目标是让每年发布的四个版本中的每一个版本都能为框架的可用性提升一个台阶。 Flutter是一个年轻的跨平台移动应用程序开发框架,所以它没有像React Native受到众多的大公司青睐也是不足为奇的。然而,这并不意味着它不好,截至2019年12月,它也为阿里巴巴、谷歌广告、Groupon等众多公司和业务所采用。 NativeScript 如果你要开始开发你的产品,“React Native”和“Flutter”绝不是唯一的解决方案。在 2020 年初,适合您的企业的替代框架也可能是 NativeScript。 这个开源框架于2015年3月公开发布,并迅速成为广受欢迎的解决方案。例如,在发布后的短短两个月内,它就获得了3000颗GitHub星标,并在Twitter上吸引了1500多名粉丝的关注。到今天为止,市场上已有超过700个插件可供选择。 在使用NativeScript构建跨平台应用程序时,开发人员首先用JavaScript及其超集TypeScript编写代码。然后,将代码库编译成各自平台原生的编程语言。 另外值得一提的是,使用 NativeScript 的开发人员也可以使用第三方库(CocoaPods 和 Android SDK),而无需包装。 与React Native类似,NativeScript允许访问Android和iOS原生API,这对跨平台应用程序有明显的积极影响。然而,不同之处在于,前者需要构建桥接API,而后者(用Progress首席开发者倡导者TJ VanToll的话说是“将所有iOS和Android API注入JavaScript虚拟机”)。与Facebook框架的另一个相似之处在于代码重用,在这两种情况下都可以达到90%。 Xamarin Xamarin开源框架创建于2011年,这使它成为了这个列表中最“古老“的框架,但直到五年前它被微软收购时,它才获得了发展势头。截至今天,它号称拥有超过6万名贡献者的社区。 从技术上讲,要用Xamarin构建跨平台的移动应用,需要很好地掌握.NET和C#两种技术,前者是使用多种语言(包括C#编程语言)、编辑器和库的开发平台。Xamarin用一组工具补充了上述平台,这些工具有助于构建跨平台应用程序,例如库、编辑器扩展和XAML。第二种技术是C#,这是一种面向对象的编程语言,它被认为比JavaScript学习起来稍难。Xamarin利用这种编程语言编写整个应用程序,从后端到原生API,再到业务逻辑。 Xamarin.Native和Xamarin.Forms Xamarin与其他框架的不同之处在于,它提供了两种编译跨平台移动应用的方式:Xamarin Native(也称为Xamarin.Android/iOS)和Xamarin.Forms。前一种方法优先考虑共享业务逻辑,并通过使用本机接口控件实现近乎本机的性能。 后者侧重于共享代码,而不是业务原理,这一方面会导致代码重用比例增加(使用Xamarin,开发人员可以重用高达96%的C#代码),但另一方面这样会降低代码性能。 您可能已经注意到,跨平台移动应用程序的性能和GUI密切相关,所以如果我说Xamarin构建应用程序的两种方法对界面的最终外观有很大影响,我可能不会感到惊讶。 Xamarin.Android/iOS允许开发人员使用原生控件和布局,而Xamarin.Forms基于标准UI元素,允许从单个API设计应用程序,但如果你需要更完美的原生UI,则可能还不够。 2020年跨平台应用程序开发还值得考虑吗? 不论如何,跨平台确实是一个值得考虑和极具前景的方向,特别是我们上面提到的 “React Native”和“Flutter”。 前者是一个成熟而稳定的框架,利用了最流行的编程语言之一,并拥有成熟的大型开发人员社区。后者是一个快速发展的技术,尽管它比React Native年轻的多,它也已经赢得了世界各地许多开发人员的青睐。 但无论您选择的是“React Native”、“Flutter”还是任何其他框架,跨平台方法都一定会为您节省时间和金钱,同时能为你最大限度地扩大市场覆盖范围。 最后,值不值得考虑,最终还是取决于你的业务目标、预算和时限。 来源;:葡萄城官网
问问小秘 2020-04-15 13:30:17 0 浏览量 回答数 0

问题

【前沿对话】如何看待国产操作系统UOS?体验如何?

【前沿对话】如何看待国产操作系统UOS?体验如何? 统一操作系统官网正式发布了 UOS v20,这是统一操作系统 v20 系列的首个正式版本。 UOS 是一个基于 Linux 内核的操作系统...
问问小秘 2020-01-17 10:46:49 1108 浏览量 回答数 5

回答

1,架构师是什么?要想往架构师的方向发展首先要知道架构师是什么?架构师是一个既需要掌控整体又需要洞悉局部瓶颈并依据具体的业务场景给出解决方案的团队领导型人物。一个架构师得需要足够的想像力,能把各种目标需求进行不同维度的扩展,为目标客户提供更为全面的需求清单。架构师在软件开发的整个过程中起着很重要的作用。说的详细一些,架构师就是确认和评估系统需求,给出开发规范,搭建系统实现的核心构架,并澄清技术细节、扫清主要难点的技术人员。主要着眼于系统的“技术实现”。2,架构师的任务架构师的主要任务不是从事具体的软件程序的编写,而是从事更高层次的开发构架工作。他必须对开发技术非常了解,并且需要有良好的组织管理能力。可以这样说,一个架构师工作的好坏决定了整个软件开发项目的成败。在成为Java架构师之前,应当先成为Java工程师。熟练使用各种框架,并知道它们实现的原理。jvm虚拟机原理、调优,懂得jvm能让你写出性能更好的代码;池技术,什么对象池,连接池,线程池……Java反射技术,写框架必备的技术,遇到有严重的性能问题,替代方案java字节码技术;nio,没什么好说的,值得注意的是"直接内存"的特点,使用场景;java多线程同步异步;java各种集合对象的实现原理,了解这些可以让你在解决问题时选择合适的数据结构,高效的解决问题,比如hashmap的实现原理,好多五年以上经验的人都弄不清楚,还有为什扩容时有性能问题?不弄清楚这些原理,就写不出高效的代码,还会认为自己做的很对;总之一句话,越基础的东西越重要,很多人认为自己会用它们写代码了,其实仅仅是知道如何调用api而已,离会用还差的远。如果你立志做架构,首先打好基础,从最底层开始。然后发展到各种技术和语言,什么都要懂两点,要全面且不肤浅。为什么不是懂一点?你要看得透彻,必须尽量深入一些。别人懂一点,你要做架构师,必须再多懂一点。比如你发现golang很流行,别人可能写一个helloworld就说自己玩过golang,但你至少要尝试写一个完整的应用。不肯下苦功,如何高人一头?另外你要非常深入地了解至少一门语言,如果你的目标是java,就学到极致,作为敲门砖,先吃饱了才能谈理想。3,架构师都是从码农过来的而Java学到极致势必涉及到设计模式,算法和数据结构,多线程,文件及网络IO,数据库及ORM,不一而足。这些概念放之一切语言都适用。先精一门,为全面且不肤浅打基础。另外就是向有经验的架构师学习,和小伙伴们讨论辩论争论。其实最重要的能力就是不断学习。在思考新的技术是否能更好地解决你们遇到的问题之前,你首先得知道并了解新的技术。架构师都是从码农过来的,媳妇熬成婆。千万不要成为不写代码的架构师,有些公司专门产不写技术的架构师。所谓架构师,只是功底深厚的程序员而已。个人认为应该扎扎实实学习基础知识,学习各种规范,架构,需要广泛的知识面,懂的东西越多视野越开阔,设计的东西当然会越好越全面。成为架构师需要时间的积累的,不但要知其然还要知其所以然。平时的一点一滴你感觉不到特别用处,但某天你会发现所有东西都没有白学的。4,架构师知识体系下面是我总结多年经验开发的架构师知识体系一、分布式架构架构分布式的英文( Distributed computing 分布式计算技术)的应用和工具,成熟目前的技术包括 J2EE,CORBA 和 .NET(DCOM),这些技术牵扯的内容非常广,相关的书籍也非常多。本文不介绍这些技术的内容,也没有涉及这些技术的细节,只是从各种分布式系统平台产生的背景和在软件开发中应用的情况来探讨它们的主要异同。分布式系统是一个古老而宽泛的话题,而近几年因为“大数据”概念的兴起,又焕发出了新的青春与活力。除此之外,分布式系统也是一门理论模型与工程技法。并重的学科内容相比于机器学习这样的研究方向,学习分布式系统的同学往往会感觉:“入门容易,深入难”的确,学习分布式系统几乎不需要太多数学知识。分布式系统是一个复杂且宽泛的研究领域,学习一两门在线课程,看一两本书可能都是不能完全覆盖其所有内容的。总的来说,分布式系统要做的任务就是把多台机器有机的组合,连接起来,让其协同完成一件任务,可以是计算任务,也可以是存储任务。如果一定要给近些年的分布式系统研究做一个分类的话,我个人认为大概可以包括三大部分:分布式存储系统分布式计算系统分布式管理系统二、微服务当前微服务很热,大家都号称在使用微服务架构,但究竟什么是微服务架构?微服务架构是不是发展趋势?对于这些问题,我们都缺乏清楚的认识。为解决单体架构下的各种问题,微服务架构应运而生。与其构建一个臃肿庞大,难以驯服的怪兽,还不如及早将服务拆分。微服务的核心思想便是服务拆分与解耦,降低复杂性。微服务强调将功能合理拆解,尽可能保证每个服务的功能单一,按照单一责任原则(Single Responsibility Principle)明确角色。将各个服务做轻,从而做到灵活,可复用,亦可根据各个服务自身资源需求,单独布署,单独作横向扩展。微服务架构(Microservice Architecture)是一种架构概念,旨在通过将功能分解到各个离散的服务中以实现对解决方案的解耦。你可以将其看作是在架构层次而非获取服务的类上应用很多 SOLID 原则。微服务架构是个很有趣的概念,它的主要作用是将功能分解到离散的各个服务当中,从而降低系统的耦合性,并提供更加灵活的服务支持。概念:把一个大型的单个应用程序和服务拆分为数个甚至数十个的支持微服务,它可扩展单个组件而不是整个的应用程序堆栈,从而满足服务等级协议。定义:围绕业务领域组件来创建应用,这些应用可独立地进行开发,管理和迭代在分散的组件中使用云架构和平台式部署,管理和服务功能,使产品交付变得更加简单。本质:用一些功能比较明确,业务比较精练的服务去解决更大,更实际的问题。三、源码分析从字面意义上来讲,源文件的英文指一个文件,指源代码的集合。源代码则是一组具有特定意义的可以实现特定功能的字符(程序开发代码)。源码分析是一种临界知识,掌握了这种临界知识,能不变应万变,源码分析对于很多人来说很枯燥,生涩难懂。源码阅读,我觉得最核心有三点:技术基础+强烈的求知欲+耐心。我认为是阅读源码的最核心驱动力我见到绝大多数程序员,对学习的态度,基本上就是这几个层次(很偏激哦):1,只关注项目本身,不懂就百度一下。2,除了做好项目,还会阅读和项目有关的技术书籍,看维基百科。3,除了阅读和项目相关的书外,还会阅读IT行业的书,比如学的Java的时,还会去了解函数语言,如LISP。4,找一些开源项目看看,大量试用第三方框架,还会写写演示。5,阅读基础框架,J2EE 规范,调试服务器内核。大多数程序都是第1种,到第5种不光需要浓厚的兴趣,还需要勇气:?我能读懂吗其实,你能够读懂的耐心,真的很重要。因为你极少看到阅读源码的指导性文章或书籍,也没有人要求或建议你读。你读的过程中经常会卡住,而一卡主可能就陷进了迷宫这时,你需要做的,可能是暂时中断一下,再从外围看看它:如API结构,框架的设计图。四、工具使用工欲善其事必先利其器,工具对 Java 的的程序员的重要性不言而喻现在有很多库,实用工具和程序任的 Java 的开发人员选择。下图列出的工具都是程序员必不可少的工具五、性能优化不管是应付前端面试还是改进产品体验,性能优化都是躲不开的话题。优化的目的是让用户有“快”的感受,那如何让用户感受到快呢?加载速度真的很快,用户打开输入网址按下回车立即看到了页面加载速度并没有变快,但用户感觉你的网站很快性能优化取决于多个因素,包括垃圾收集,虚拟机和底层操作系统(OS)设置。有多个工具可供开发人员进行分析和优化时使用,你可以通过阅读爪哇工具的源代码优化和分析来学习和使用它们。必须要明白的是,没有两个应用程序可以使用相同的优化方式,也没有完美的优化的 Java 应用程序的参考路径。使用最佳实践并且坚持采用适当的方式处理性能优化。想要达到真正最高的性能优化,你作为一个 Java 的开发人员,需要对 Java 的虚拟机(JVM)和底层操作系统有正确的理解。性能优化,简而言之,就是在不影响系统运行正确性的前提下,使之运行地更快,完成特定功能所需的时间更短。性能问题永远是永恒的主题之一,而优化则更需要技巧。Java程序员如何学习才能快速入门并精通呢?当真正开始学习的时候难免不知道从哪入手,导致效率低下影响继续学习的信心。但最重要的是不知道哪些技术需要重点掌握,学习时频繁踩坑,最终浪费大量时间,所以有一套实用的视频课程用来跟着学习是非常有必要的。为了让学习变得轻松、高效,今天给大家免费分享一套阿里架构师传授的一套教学资源。帮助大家在成为架构师的道路上披荆斩棘。这套视频课程详细讲解了(Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构)等这些成为架构师必备的内容!而且还把框架需要用到的各种程序进行了打包,根据基础视频可以让你轻松搭建分布式框架环境,像在企业生产环境一样进行学习和实践。
auto_answer 2019-12-02 01:51:27 0 浏览量 回答数 0

回答

第十名、R语言 颁奖词 R语言,一种自由软件编程语言与操作环境,主要用于统计分析、绘图、数据挖掘。R基于S语言的一个GNU计划项目,所以也可以当作S语言的一种实现,通常用S语言编写的代码都可以不作修改的在R环境下运行。R的语法是来自Scheme。 提名词 R语言作者,George Ross Ihaka:在奥克兰大学统计系任副教授,是R语言的最初作者。 排名理由 作者头发浓密度:100% 第九名、Python 颁奖词 Python是一种广泛使用的高级编程语言,属于通用型编程语言。作为一种解释型语言,Python的设计哲学强调代码的可读性和简洁的语法。相比于C++或Java,Python让开发者能够用更少的代码表达想法。不管是小型还是大型程序,该语言都试图让程序的结构清晰明了。 提名词 Python语言作者,Guido van Rossum:生于荷兰哈勒姆,计算机程序员,为Python程序设计语言的最初设计者及主要架构师。 排名理由 作者头发浓密度:95% 第八名、C语言 颁奖词 C是一种通用的编程语言,广泛用于系统软件与应用软件的开发。C语言具有高效、灵活、功能丰富、表达力强和较高的可移植性等特点。C语言编译器普遍存在于各种不同的操作系统中,例如Microsoft Windows、macOS、Linux、Unix等。C语言的设计影响了众多后来的编程语言,例如C++、Objective-C、Java、C#等。 提名词 C语言作者,Dennis MacAlistair Ritchie:美国计算机科学家。黑客圈子通常称他为“dmr”。他是C语言的创造者、Unix操作系统的关键开发者,对计算机领域产生了深远影响,并与肯·汤普逊同为1983年图灵奖得主。 排名理由 作者头发浓密度:85%(+胡须) 第七名、Go 颁奖词 Go(又称Golang)是Google开发的一种静态强类型、编译型、并发型,并具有垃圾回收功能的编程语言。Go的语法接近C语言,但对于变量的声明有所不同。Go支持垃圾回收功能。 提名词 Go语言作者,Robert C. Pike:来自加拿大的程序员,曾经加入贝尔实验室,为 UNIX小组的成员。他与肯·汤普逊共同开发了UTF-8。目前为 google的工程师,参与编程语言 Go与Sawzall的研发工作。 排名理由 作者头发浓密度:80% 第六名、JavaScript 颁奖词 JavaScript,通常缩写为JS,是一种高级的,解释执行的编程语言。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它已经由ECMA(欧洲计算机制造商协会)通过ECMAScript实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。 提名词 JavaScript语言作者,Brendan Eich:美国程序员与企业家,JavaScript主要创造者与架构师,曾任Mozilla公司的首席技术官,并曾短暂担任首席执行官。 排名理由 作者头发浓密度:75% 第五名、Objective-C 颁奖词 Objective-C是一种通用、高级、面向对象的编程语言。它扩展了标准的ANSI C编程语言,将Smalltalk式的消息传递机制加入到ANSI C中。目前主要支持的编译器有GCC和Clang(采用LLVM作为后端)。 提名词 Objective-C作者,Brad Cox:美国计算机科学家。于傅尔曼大学主修化学与数学,于芝加哥大学取得数学生物学博士学位。Objective-C主要作者。 排名理由 作者头发浓密度:70% 第四名、PHP 颁奖词 PHP(全称:PHP:Hypertext Preprocessor,即“PHP:超文本预处理器”)是开源的通用计算机脚本语言,尤其适用于网络开发并可嵌入HTML中使用。PHP的语法借鉴吸收C语言、Java和Perl等流行计算机语言的特点,易于一般程序员学习。PHP的主要目标是允许网络开发人员快速编写动态页面,但PHP也被用于其他很多领域。 提名词 PHP语言作者,Rasmus Lerdorf:出生于格陵兰岛凯凯塔苏瓦克,是一个丹麦程序员,他拥有加拿大国籍。他也是编程语言PHP的创始人,其中PHP的头两个版本是由他编写的,后来他也参与PHP后续版本的开发。 排名理由 作者头发浓密度:60% 第三名、Java 颁奖词 Java是一种广泛使用的计算机编程语言,拥有跨平台、面向对象、泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发。Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。 提名词 Java语言作者,James Gosling:出生于加拿大,软件专家,Java编程语言的共同创始人之一,一般公认他为“Java之父”。 排名理由 作者头发浓密度:50% 第二名、C++ 颁奖词 C++是一种使用广泛的计算机程序设计语言。它是一种通用程序设计语言,支持多重编程模式,例如过程化程序设计、数据抽象、面向对象程序设计、泛型程序设计和设计模式等。 提名词 C++语言作者,Bjarne Stroustrup:生于丹麦奥胡斯郡,计算机科学家。他以创造C++编程语言而闻名,被称为“C++之父”。 排名理由 作者头发浓密度:40% 第一名、Visual Basic .NET 颁奖词 Visual Basic .NET(VB.NET)是.NET Framework框架下的一种多重编程范式高级语言。Visual Basic .NET属Basic系语言,其语法特点是以极具亲和力的英文单词为基础标识,以及与自然语言极其相近的逻辑表达,有时候你会觉得写VB.NET代码就好像在写英文句子一样,从这个角度来说,VB.NET似乎是最高级的一门编程语言,当然在Basic系语言中VB.NET也确实是迄今为止最强大的一门编程语言。 提名词 Visual Basic .NET作者,Alan Cooper:交互设计的提倡者。库珀有些时候被叫做 Visual Basic 之父,虽然大多数的工作是由微软的内部开发团队完成的,但是对于Windows可视化设计工具的创意是来源于库珀的。 排名理由 作者头发浓密度:0% 以上,就是世界上最难学的编程语言前十名,本次大赛组委会认为,作者的头发越稀少,说明这种语言在学习过程中要掉越多的头发,所以,推导出这种语言越难学。 你现在学得语言排名第几呢?欢迎在下方评论区留言哦~ 原文链接 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答
有只黑白猫 2020-01-16 17:41:53 0 浏览量 回答数 0

问题

九个衡量Rails应用性能的小方法

你有个绝佳的商业创意,日复一日地将它完善丰满起来。后来,你雇了一群天赋异禀的开发者、Web 设计师和用户体验专家,他们用一种非常棒的框架——Ruby on Rails 帮你实现长久以来的梦想。 你...
sunny夏筱 2019-12-01 21:43:43 7571 浏览量 回答数 3

问题

性能测试:软件测试的重中之重

       性能测试在软件的质量保证中起着重要的作用,它包括的测试内容丰富多样。中国软件评测中心将性能测试概括为三个方面:应用在客户端性能的测试、应用在网络上性能的测试和应用在服务器端性能的测试。通常情况下&#...
云效平台 2019-12-01 21:45:09 5839 浏览量 回答数 1

回答

疫情下的2020,程序员找工作和往年有什么不同?该如何寻找方向? ###行业环境 曾经 以前端为例,早期(2009年之前)的程序员岗位中,甚至都没有单独的前端岗位。页 面UI的设计与开发大多数都有后端包揽。存在感很小,那时候的程序员,也没有如今的火 热,在那个年代,金融行业仍是主流;那个电脑,程序员并没有如现在这般被大众所熟知与多金。 十年来风云莫测,Java易主了,node.js诞生了,互联网行业又重新注入了新的活力。 互联网行业同时也带动了周边相关行业的发展,比如IT培训、在线教育、社交电商等等, 从2011年淘宝双十一开始,淘宝真正成为国民电商平台的霸主。淘宝这个最大的电商平台, 可以说是一个集众多IT技术于一身的一个产物了。也是开启互联网时代的领头人,现如今 的时代,是移动互联网的世界。IT作为一个未来一个大时代的走向,是会越来越成熟,越 来越奔放的。 就薪资而言,曾经一直占领行业薪资top的金融行业,如今也被互联网岗位所取代。看到这里你可能会说某某财务总监年薪百万,可是你可曾想过,一个普通公司也许就那么一位或几位年薪百万的财务总监,但是在阿里巴巴这样的企业里,年薪百万未必非要坐上财务总监的位置,不完全统计,年薪百万的阿里人(开发岗)不低于4位数,技术驱动核心竞争力。那个时代,HTML5出世,移动互联网也迎来红利期,微信、今日头条、抖音等超级APP相继诞生 现在 不知怎么了,2019年起互联网行业内出现了很大波动,大批中小微企业倒闭、员工事业,不景气的企业用着正规或不正规的手段裁员,校招紧缩,员工生病被辞退等新闻被揭露。也许是互联网行业走向成熟,伴随着的优胜略汰的现象,如今的互联网,再也不是随便随便拿着PPT去路演就能拿到投资的行业,个人觉得,互联网行业在2020年将从“平台为王”向“服务为王”进行转换,谁能在服务上获得用户的认可,谁就有可能会获得更快的发展速度,所以对于大型互联网平台来说,2020年所面临的挑战还是非常大的。如果说在增量时代,互联网行业拼的是速度,那么在存量时代,互联网行业将开始拼服务,而服务体验度的不断提升是互联网行业发展的一个必然结果。 程序员现状 过去 过去的程序员找工作只要技术够牛就不会愁工作,2013年网上还盛传企业去教育培训机构挖人的新闻,如今这种现象是不会存在的。这也许就是一个行业走向稳定和成熟所伴随的稳重而不盲目。 对于程序员而言,所要关注的不该仅仅是技术本身了,学历、英语、沟通与表达能力也都非常重要。而前端为例,曾经写写jQ就能找到一份工作,在无内推的情况下,如今不会三大框架可能连简历都筛选不过去,行内盛传一句戏谑的话”面试造火箭,工作拧螺丝”,如今确实如此。个人决定,尽管行业不如从前,招聘要求也越来越高,作为一个有志气有报复的程序员,就应该紧跟行业的脚步,保持对行业的敏感,时时刻刻不能放弃学习,欲戴王冠必承其重。无论大家处于哪些行业哪种岗位,无论你是做算法岗还是业务应用开发,你都是在为互联网行业提供自己的一份力。GITHUB、StackOverFlow、掘金上那么多活跃的前辈、队友都在为互联网积极贡献开源项目,为这个行业发光发热。 未来 因为笔者是前端岗,我就以前端岗为例谈谈对当下及未来前端岗位的发展方向和技术要求。 当下前端热门的话题有AI、跨端应用、音视频等等。前端做AI在以前看来是否是不可能的事,我想大多数人和我一样,第一次听见“人工智能”这个词的时候都会觉得是一个很高大上、遥不可及的概念,我们对它的印象总是停留在各种各样神奇而又复杂的算法,这些仿佛都是那些名校博士才有能力去做的工作。我也曾一度以为自己和这个行业没有太多缘分,但自从Tensorflow发布了JS版本之后,这一领域又引起了我的注意。在python垄断的时代,发布JS工具库不就是意味着我们前端工程师也可以参与其中。可以参考JS图像识别项目(https://github.com/jerryOnlyZRJ/image-regression)。 随着JS引擎的计算能力不断增强,人工智能领域的不断发展,可以预见的是,在不久的将来,肯定能有一些简单的算法可以被移植到用户前端执行,这样既能减少请求,又能分担后端压力。这一切并不是无稽之谈,为什么tensorflow.js会应运而生,正是因为JS的社区在不断壮大,JS这款便捷的语言也在得到更为普遍的使用。 还是应征了那句老话:技术从来不会受限于语言,受限你的,永远只是思想。 谈到前端前端框架,目前有 Vue、React、Svelte、Angular (按GITHUB排行榜);初次之外,各种平台的框架也都层次不穷,以小程序为例就有taro、omi、uniapp、mpx、mpvue等等,前端轮子多,总有一款适合你。但是探究和比较框架已经没有实际意义了,狼叔在2019年的D2论坛上的演讲,其中那句话令我记忆深刻,“前端的纷争已经结束,接下来的重点是提效”,现在已经不是争论三驾马车和flutter框架之争、性能之争,而是如何运用前端技术去发力、提高生成效能。因为最终我们的生产成果需要接收社会大众的检验,学好技术是过程,做好产品是结果,不该把时间放在没有效率的事上。 保持学习的热情,保持编码的的热情,无论你现在是写算法亦或是写业务,术业有专职。 前端面试指南 针对招聘需求可能会要求的一些技术栈,我整理一些常用的前端框架和技能,但是很不够全面,比如canvs、webgl、threeJs、phaser、pixi等等绘图、可视化相关的东西都没有列举到,仅供大家参考。 2020谁的码生不迷茫 码生如佛,弓象征着码生的曲曲折折,一撇是那曾经走的弯路,那一竖是将要走的路,2020年,希望大家大道至简,学会权衡,懂得舍弃,持续进化,抓住机遇。共勉~
问问小秘 2020-03-23 10:08:43 0 浏览量 回答数 0

问题

微服务开发的 10 个最佳实践

1. 领域驱动设计: 开发微服务的首要挑战是将大型、复杂的应用程序分割成小型、自主、独立的可部署模块。如果微服务没有以正确的方式进行分割,将会出现紧耦合的微服务,这些微服务将具有单体架构的所有缺点...
游客pklijor6gytpx 2020-01-03 14:59:12 147 浏览量 回答数 1

问题

“木兰抄袭Python”官方致歉!从“红芯”到“木兰”,国产套壳何时休?

近日,中科院计算所下属团队号称完全自主设计、开发和实现的编程语言“木兰”被推到了舆论的中心,体验过后开发者们纷纷表示:这就是个套壳的Python。随着事件的发酵,项目负责人刘雷终于道歉...
茶什i 2020-01-20 12:00:45 1642 浏览量 回答数 1

问题

Web测试方法

在Web工程过程中,基于Web系统的测试、确认和验收是一项重要而富有挑战性的工作。基于Web的系统测试与传统的软件测试不同,它不但需要检查和验证是否按照设计的要求运行,而且还要测试系统在不同用户的浏...
技术小菜鸟 2019-12-01 21:41:32 7022 浏览量 回答数 1

回答

怎么 没人来呀 @中山野鬼###### 1、如果想去掉while(true),可以考虑通知实现; 2、关于自动重连的问题,可以考虑重发送逻辑中抽离出来,采用心跳检测完成; 3、另外发送速率统计部分也应该抽离出来。 4、上多通道要考虑资源使用可控。 5、实在不行按照业务拆分成多模块,用redis 或mq类的扩展一下架构设计; ######回复 @OS小小小 : map =(Map)JSONObject.parse(SendMsgCMPP2ThredPoolByDB.ZhangYi.take()); 换成take,阻塞线程,试试。######回复 @OS小小小 : 1、通知只是告知队列里有新的数据需要处理了; 5、内存队列换成redis队列 实现成本增加,但是可扩展性增加;######1、通知实现的话 ,岂不是 无法保证 最少发送么,又会陷入另一个问题中 是吗? 或者是我的想法不对么? 2、嗯,这一块可以这样做。谢谢你 3、速率统计这里 我目前想不到怎么抽离、既可以控制到位,又可以保证不影响。。。 5、redis 是有的 但是 redis的队列的话 跟我这个 没啥区别吧,可能速度更快一点。######while(true) 里面 没数据最起码要休眠啊,不停死循环操作,又没有休眠cpu不高才怪######回复 @OS小小小 : 休眠是必须的,只是前面有数据进来,可以用wait notify 的思路通知,思路就是这样,CountDownLatch 之类多线程通讯也可以实现有数据来就能立即处理的功能######嗯,目前在测试 排除没有数据的情况,所以这一块没有去让他休眠,后面会加进去。 就针对于目前这种情况,有啥好办法吗###### 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true) ######这才是对的做法######嗯,这思路可以。谢谢哈###### 引用来自“K袁”的评论 我的思路是:一个主线程,多个任务子线程。 主线程有一层while(true),这个循环是不断的扫描LinkedBlockingQueue是否有数据,有则交个任务子线程(也就是你这里定义的线程池)处理,而不是像你这样每个子任务线程都有一个while(true) 正确做法. 还有就是 LinkedBlockingQueue 本身阻塞的,while(true)没问题,主要在于不需要每个发送线程都去block######while(true)不加休眠就会这样###### java 的线程数量大致要和cpu数量一致,并不是越多越快,线程调度是很消耗时间的。要用好多线程,就需要设计出好的多线程业务模型,不恰当的sleep和block是性能的噩梦。利用好LinkedBlockingQueue,队列空闲时读队列的线程会释放cpu。利用消息触发后续线程工作,就没必要使用while(true)来不停的扫描。 ######@蓝水晶飞机 看到你要比牛逼,我就没有兴趣跟你说话了######回复 @不日小鸡 : 我就是装逼怎么啦,特么的装逼装出样子来的,起码也比你牛逼啊。######回复 @蓝水晶飞机 : 你说这话不能掩盖你没有回复我的问题又来回复我导致装逼失败的事实。 那你不是楼主你回复我干什么,还不是回答我的问题。 不要装逼了好么,装多就成傻逼了######回复 @不日小鸡 : 此贴楼主不是你,装什么逼。######回复 @王斌_ : 这些我都知道,我的意思是你这样回复可能会误导其他看帖子的人或者新手,让他们以为线程数就等于CPU数###### 引用来自“OS小小小”的评论 怎么 没人来呀 @中山野鬼 抬举我了。c++ 我还敢对不知深浅的人说,“权当我不懂”,java真心只是学过,没有实际工程上的经验。哈。而且我是c的思维,面对c适合的应用开发,是反对使用线程的。基本思维是,执行模块的生命周期不以任务为决定,同类的执行模块,可根据物理硬核数量,形成对应独立多个进程,但绝对不会同类的任务独立对应多个线程。哈。所以java这类面向线程的设计,没办法参与讨论。设计应用目标不同,系统组织策略自然有异。 唯一的建议是:永远不要依赖工具,特别是所谓的垃圾资源处理回收机制,无论它做的再好,一旦你依赖,必然你的代码,在不久的将来会因为系统设计规模的变大,而变的垃圾。哈。 听不懂的随便喷,希望听懂的,能记得这个观点,这不是我一个人的观点。 ######给100万像素做插值运算进行染色特效,请问单线程怎么做比多线程快?###### @乌龟壳 : 几种方法都可以,第一是按照计算步骤,每个进程处理一个步骤,然后切换共享空间(这没有数据传递逻辑上的额外开销),就是流水思维。第二个是block的思维,同样的几个进程负责相同计算,但负责不同片区。同时存在另一类的进程是对前期并发处理完的工作进行边界处理。 你这个例子体现不出进程和线程的差异的。 如果非要考虑进程和线程在片内cache的差异,如果没记错(错了大家纠正哈),进程之间的共享是在二级缓存之间吧。即便线程能做到一级缓存之间的共享,但对于这种大批量像素的计算,用进程仍然是使用 dma,将数据成块载入一级缓存区域进行处理,而这个载入工作和计算工作是同步的。不会有额外太多的延迟。 你举的这个例子,还真好是我以前的老本行。再说了。像素计算,如今都用专用计算处理器了吧。还用x86或arm来处理,不累死啊。哈。 而且这种东西java不适合,同样的处理器,用c写,基本可以比java快1到2倍。因为c可以直接根据硬件特性和计算逻辑特点有效调度底层硬件驱动方式。而java即便你用了底层优化的官方库,仍然不能保证硬件与计算目标特性的高度整合。 ######回复 @中山野鬼 : 简单来说,你的多个进程处理结果进行汇总的时候,是不是要做内存复制操作?如果是多线程天然就不用,多进程用系统的共享内存机制也不用,问题是既然用了共享内存,和多线程就没区别了。######回复 @乌龟壳 : 两回事哦。共享空间是独立的,而线程如果我没记错,全局变量,包括文件内的(静态变量)是共享的。不同线程共享同一个进程内的变量嘛。这些和业务逻辑相关的东西,每个线程又是独立一套业务逻辑,针对c语言,这样去设计,不是没事找事嘛。面向对象语言,这块都帮你处理好了,自然没有关系。######既然有共享空间了,那你所说的进程和线程实际就是一回事了。###### @乌龟壳   ,数据分两种,一种和算法或处理相关的。一种是待处理的数据。 前者,不应该共享,后者属于数据加工流程,必然存在数据传递或流动,最低成本的传递/流动方式就是共享内存,交替使用权限的思路。 但这仅仅针对待加工的数据和辅助信息,而不针对程序本身。 进程不会搞混乱这些东西特别是(待加工数据的辅助信息),而线程,就各种乱吧。哈。 进程之间,虽然用共享空间,但它本质是数据传递/流动,当你采用多机(物理机器)并发处理时,进程移动到另外一个物理主机,则共享空间就是不能选择的传递/流动方式了。但线程就没有这些概念。 ######回复 @中山野鬼 : 是啊,java天然就不是像C一样对汇编的包装。######@乌龟壳 面向企业级的各种业务,java这些没问题的。而且更有优势,面向计算设备特性的设计开发,就不行了。哈。######回复 @中山野鬼 : 也算各有场景吧,java同样可以多进程可以分布式来降低多线程的风险。java也可以静态编译成目标机器码。总之事在人为。######回复 @乌龟壳 : 高手,啥都可以,低手,依赖这些,就是各种想当然。哈哈。######回复 @中山野鬼 : 那针对java的垃圾回收,这个东西是可以调节它算法的,不算依赖工具吧,哈。不然依赖C语言语法也算依赖工具咯。哈。;-p
kun坤 2020-05-31 13:04:51 0 浏览量 回答数 0

回答

“求知若饥,虚心若愚”——这个原本出自《全球概览》的俳句,因为乔布斯在斯坦福大学毕业演讲中的引用而备受推崇,流传成为 IT 界的至理名言之一。在编程界,亦有“代码胜于雄辩”、“Done is better than perfect”等警句,寥寥数语将编程工作者的形象特质描摹到了极致。程序员,就是技术至上、唯代码是瞻且必须不断武装自己的群体。 21 世纪,高薪、高端、高技术范儿已成为程序员的固有标签,在这个新的元年,CSDN 将基于一年一度的开发者大调查数据,以全新的视角深入发掘中国开发者群体的整体现状、应用开发技术以及开发工具/平台的发展趋势,呈现更真实、更全面且更有学习价值的开发者画像。 30 岁以下开发者人数占比超八成,全国有 19.6% 开发者月薪超过 1.7 万元; 六成开发者在使用 Java 语言,近五成开发者近期最想学 Python 语言; Spark、Redis 和 Kafka 正在成为企业大数据平台通用技术组件; 区块链技术近两年是热点,比特币和以太坊是两种主流的区块链开发平台; 人工智能技术日益受到企业和市场的关注,但 64% 企业尚未实现智能化,机器学习/深度学习算法工程师最为急缺; 近七成开发者认为未来 5G 网络的传输速率能达到 4G 网络的 10 倍以上; Apache 项目和 Linux 是开发者较为喜欢的开源项目; 半数开发者很少参与开源项目的开发、维护、运营和社区发展等。 软件开发准入门槛持续降低,近 2 成开发者月薪超过 1.7 万 30 岁以下开发者人数占比超八成,软件开发从业门槛持续降低 从 2015 年到 2019 年的调研数据来看:30 岁及以下的开发者人群占比在 8 成以上,一直是软件开发领域的主力军;全国近半数的开发者工作在一线城市(北京、上海、广州、深圳、天津);物联网、软件、IT 制造三个技术领域涵盖了国内 84% 以上的开发者;本科及以上学历占 8 成;92% 的开发者是男性。 和国外开发者年龄分布趋势大概一致,国内的软件开发群体一直呈现出越来越年轻化的特点。这是因为,一方面软件开发行业蓬勃发展,各行各业都需要软件开发相关人才,也有越来越多的毕业生选择从事该行业;另一方面,是因为编程语言、框架、云服务等基础设施的持续完善,从事软件开发的门槛在持续降低,更容易接纳新鲜血液,报告统计发现,本科学历是开发者的主力军,66% 的开发者拥有本科学历,而硕士研究生、博士研究生仅占 11%、1%。 八成以上开发者月薪在 5 千~3 万元之间,19.6% 开发者月薪超过 1.7 万元 通过结合受教育程度和薪资水平的数据特点来看,学历越高的人群中,月薪 1.7 万元以上的高收入比例越高。在一线城市(北京、上海、广州、深圳、天津)中,月薪超过 1.7 万元的开发者占比为 30%,该比例远高于国内其它城市。 开发者属于相对高薪的职业,尤其是在一线城市中,但不同开发者之间收入差距较大。软件开发是一个智力密集型的工作,不同开发者能够提供的价值差别很大,这就使得一个优秀开发者的收入远高于普通开发者:硕士和博士毕业的高收入者比率要远高于本科及以下的;金融和互联网行业的高收入比率最高。 自学是开发者持续学习的主要路径 软件开发行业日新月异,只有保持持续学习才能跟上技术变化的脚步,终身学习是现代人保持竞争力甚至是维持生存的必要手段。 从调研中可以看到,53% 的开发者会通过在未参加正式课程的情况下,自学一门新语言、框架或工具。但同时,也有半数的人参加过在职培训或者线下课程,相对于自学的灵活性而言,这类培训会更为系统和完整,对于长期的个人提升有所裨益,开发者可以适当选择。但与之相悖的是,只有不到 40% 的开发者,愿意为学习付费,这可能会导致参与的课程质量不够高。 Java 雄踞语言榜,Visual Studio 受开发者欢迎 Java 长盛:使用最多,开发者最想学 从编程语言来看,Java 是最多人使用的语言,而 JavaScript 和 SQL 分别是第二第三位。这三门语言,使用场景都很广泛,Java 一方面后端开发最常使用,生态成熟度无人可比;另一方面,Java 依然是 Android 上最重要的开发语言,与之相比 ,新兴的 Kotlin 只有 2% 的开发者在使用。而 JavaScript 不仅是前端开发的必备语言,还用在 Web 开发、小程序开发等场景下。 Java 和 Python 依然是开发者最希望学习的语言之一,只是相比之下,Python 的热度有所降低,这可能和机器学习没有去年那么火热有所关联。变化比较大的是 Go 语言,与去年相比,今年的调研中想学 Go 语言的开发者降低到了 4%,与之相似,Kotlin、R 的学习意愿也大幅降低。 从这个趋势也可以看到,如今的开发者更意愿去学习一些相对成熟度、用途更为广泛的语言,对一些代表新模式的语言乐衷程度有所降低。 七成以上在使用 Windows 操作系统,83% 在使用 MySQL 数据库 72% 开发者在使用 Windows 操作系统,18% 在使用 Linux 系列操作系统。在存储服务的使用上,MySQL 继续扩大其使用率到达了 83%,几乎是开发者必备的技能。和去年相比,Elasticsearch 出现在数据库使用的调研中,在大数据时代,Elasticsearch 作为提供搜索服务的第一选型,也必然会被越来越多的开发者学习和使用 Node.js 是相对使用普遍的技术框架 在 Web 开发上,前端使用 Vue.js 后端使用 Spring 是最常见的选型方案,与之相对应,Node.js 是最多被用到的框架,这和当今多端开发的趋势密不可分。后端用微服务架构,中间用 Node.js 粘合出适合 Web、Android、iOS 等不同端和场景使用的 APIs,是当下主流的部署方案之一,既可以前后端分离提高开发效率,又可以在保障服务稳定性的同时提升灵活性。而TensorFlow 成为开发者最期望学习的框架,这说明开发者依然对机器学习保持关注和热情。 Visual Studio 是最为普遍使用的开发环境 在开发环境的选择上,Visual Studio 是最为普遍使用的开发环境,这和微软对开发者的投入密不可分。微软投入了大量的研发力量,使得 Visual Studio 可以在各种操作系统进行各种编程语言的开发,其强大且完善的插件系统可以满足开发者的各种需求,使其可以超过 IntelliJ。 大数据平台以私有云部署为主,Spark 使用率高达 44% 私有云部署解决方案是企业构建大数据平台的主要方式 随着分布式计算和云平台的逐步成熟,目前大部分公司都有能力搭建自己的大数据平台。调研数据显示,81% 企业在进行大数据相关的开发和应用,50% 的企业选择私有云解决方案来部署大数据应用,28% 的企业选择自主研发。 仅 19% 企业使用商业发行版 Hadoop 版本搭建数据平台 调查报告发现,有 30% 以上的企业并没有使用相对成熟的 Hadoop 技术搭建数据平台,这些企业的算法性能会很大程度上受限于低效的平台,更不可能开发出更高效的数据分析算法。但幸运的是大部分企业都基于商业版或者社区版 Hadoop 搭建了数据平台,这些公司的侧重点主要在应用发现和算法的设计层面,更有可能在不久的将来实现大数据的价值。 Spark 是企业大数据平台最普遍的组件 Apache Spark 是一个处理大规模数据的快速通用引擎,它可以独立运行,也可以在 Hadoop、Mesos、云端运行,它可以访问各种数据源包括 HDFS、Cassandra、HBase 和 S3,可以提升 Hadoop 集群中的应用在内存和磁盘上的运行速度。Spark 生态系统中除了核心 API 之外,还包括其他附加库,可以为大数据分析和机器学习领域提供更多的能力。本次调研中,Spark 是使用最普遍的大数据平台组件,使用率达到44%,而MapReduce使用率仅为21%。 分布式文件系统 HDFS 作为核心组件之一,使用率也达到了 39%。企业对大数据平台应用最多的场景是统计分析、报表生成及数据可视化,38% 企业使用ELK(ElasticSearch + Logstash + Kibana)实时日志分析平台。 综上所述,目前大数据的发展热潮令人欢欣鼓舞。一个优秀的大数据团队,需要有对产品开发具有高敏感性同时对技术有一定理解的人才,同时需要理论基础极其扎实,能对实际问题进行抽象建模和算法设计的人才。只有双管齐下,在产品和技术方面进行深层次探索,才能真正实现大数据产业的繁荣。 区块链质变,比特币逆袭以太坊成 TOP 1 开发平台 22% 的开发者正在用或者准备用区块链技术解决技术问题 区块链技术的发展,是一个量变到质变的过程。相比于 2018 年,对区块链和加密货币了解的人从 22% 增长到 32%,准备尝试用区块链技术解决一些问题的人数从 14% 增长到 16%,仅有 4% 的人对区块链完全不了解。 43% 的受访者在从事公有链(比特币、以太坊等)的开发 本次调研中,43% 的受访者在从事公有链(比特币、以太坊等)的开发。目前行业侧重发展的方向为解决方案、公链及联盟链,公有链由于其自带激励机制,对于普通开发者有直接的回馈,所以上面开发者占比高也比较合情理。行业解决方案从去年的 27% 增加到今年的 36%,说明传统行业开发者对区块链的认可度在增加。 区块链本质上是技术,落地场景及实际应用才是连接社会效益的关键。 比特币和以太坊是当前两种主流的区块链开发平台 在行业开发者的印象中,以太坊一直是开发平台领域的头号玩家。但今年数据显示,以太坊从 2018 年的 44% 占比第一,降到 24%;比特币从 2018 年的 28%,上升到 35%,占比第一。比特币在行业内外仍然拥有最强共识,在闪电网络的加持下,大家也似乎感受到比特币离商用也不再遥远了。 金融是普遍认为的行业应用方向 金融行业是普遍认为的行业应用方向,占 36%。区块链本身具备的防篡改、可追溯的特点,能大大降低金融行业监管成本,不过金融的进入门槛相对也较高,需要各方面技术的配合。其次,智能硬件和物联网也被认为是主流应用方向,占 14%。不过相比其他众多已经很成熟的技术,依托区块链的解决方案在实际使用中,往往面临必要性缺失的问题,因此区块链应用发展仍任重道远。 在区块链结合行业之前,更加要重视与其他新技术的结合和协同:物联网设备能够提供大量数据,5G 能够提供高速传输,存储可以解决区块存放的问题等。 算法工程师最急缺,TensorFlow 占据 AI 深度学习框架榜首 64% 的企业尚未实现智能化 在经历了 2019 年的行业低谷期之后,无论是行业巨头还是新兴独角兽,都开始审视 AI 能够切实落地的场景。调研数据显示,14% 的企业尚无信息化基础,27% 的企业实现了事务处理数字化,22% 的企业具备商业智能基础设施,实现描述性分析。使用机器学习实现预测性分析和决策优化的企业占 16%,而在业务中全面使用 机器学习/深度学习算法工程师最急缺 在岗位分布上,由于深度学习是以大数据为基础的,而感知智能中的计算机视觉又是目前深度学习较为成熟的应用,所以,机器学习和深度学习工程师,以及数据工程师、计算机视觉工程师排行在前三位。当前最急缺的岗位也是机器学习/深度学习算法工程师、数据科学家/数据分析师/数据挖掘工程师岗位。 53% 的开发者表示其团队急缺机器学习/深度学习算法工程师,37% 表示急缺数据科学家/数据分析师/数据挖掘工程师。 TensorFlow是人工智能领域主流深度学习框架 此次调研中,TensorFlow 使用普及率达到 48%。从技术本身的角度来看,较为成熟的 TensorFlow 成为 AI 工程师的首选深度学习框架,Torch/PyTorch由于其开发效率较高,也得到了较多支持。 35% 开发者选用国产 AI 芯片应用于自己的 AI 开发 在 AI 芯片领域,国内厂商也开始弯道超车,越来越多的开发者也开始关注国内 AI 芯片的进展。调查数据显示,选用国产 AI 芯片应用于自己的 AI 开发时最看重的因素方面,对主流 AI 框架的支持能力是最普遍的因素,占 35%。 物联网云平台三足鼎立:阿里物联、华为云、百度 IoT 69% 的开发者认为未来 5G 网络的传输速率能达到 4G 的 10 倍以上 每一代新型的通信系统总是能带来更大的带宽。据报告显示,近七成开发者认为未来 5G 网络的传输速率能够达到 4G 网络的 10 倍以上。 影响 5G 普及的三大因素:5G 套餐价格未定、运营商的开发程度、需要更换手机 由于目前 5G 网络使用者较少,费用较低廉的套餐还没有推出,第一代 5G 终端不太成熟等原因,目前 87% 的开发者认为 5G 套餐费用过高,并且大部分开发者认为 5G 网络目前覆盖范围有限,因此将近 40% 的开发者正处于观望阶段。 值得一提的是,本次调查中 62% 的开发者认为,5G 时代应该加强对个人隐私的保护,这反映出目前社会对数据隐私越来越重视的整体趋势。 阿里物联和华为云是应用相对普遍的 IoT 云平台 根据调查,2019 年物联网云平台呈现三足鼎立的趋势:阿里物联、华为云、百度 IoT 成为用户最多的三种物联网平台,并且和第四名中移物联远远拉开了差距,这和我们的实际使用体验一致。 未来的基础物联网平台可能会继续呈现以偏硬件实现为主的华为云和以偏软件体验为主的阿里、百度物联平台的三足鼎立局面。 物联网技术开发:Linux 和 Windows 是使用较多的操作系统 Linux 和 Windows 是较普遍的操作系统,使用率分别为 51%、44%。目前在物联网设备开发过程中,Linux、Windows 和 Android 较为普遍,依然延续了 PC 平台的开发者操作系统份额。虽然华为、阿里等公司在 2019 年均发布了自己的物联网专用操作系统,但还并未得到开发者的大规模认可,大公司的物联网操作系统发展之路依然任重而道远。 Wi-Fi 是应用最普遍的物联网通信技术 在本次调研中,近距离通信(比如 Wi-Fi 和蓝牙)是现存物联网开发者最主要的通信方式。然而这种比重可能会随着未来 3~4 年内车联网的大规模商业化产生变化,汽车、工业物联、智能电网这类高移动性、高可靠和低延迟物联网场景会更适合需要整体规划的运营商网络。 六成开源开发者无收入,Apache 项目最受喜欢 77% 开发者每周在开源上投入时间不超过 5 小时 无论是大数据、区块链、人工智能还是物联网领域,其中最为重要的、最受欢迎的技术都是开源的。但是报告统计发现,有超过一半的开发者很少参与开源项目,每周在开源上投入不超过 5 小时的占 77%,其中,1 小时以内的占 31%。此外,65% 的开发者不曾在开源上获得收入,获得不错收入的仅占一成。 开发者最喜欢的开源项目是 Apache 25% 开发者最喜欢 Apache,24% 开发者最喜欢 Linux。作为全球最大的软件基金会,开发者用过的诸多项目,例如 Dubbo、Log4j、Maven、RocketMQ 和 Tomcat 等,均孵化自 Apache。 国内开源的现状虽然近年来已经有了很大的发展,但是一个残酷的事实是,老兵正在离开这个行业,离开一线开发的队伍:报告数据显示,30 岁以下的开发者人数超过 82%,接触开源的时间在 5 年以内的开发者超过 83%。随着那些经验丰富的老兵转行或是进入管理层,不再写代码、也不再参与开源的事实也就凸显出来.....未来开源的建设,依然任重而道远。 在数据中寻找共性,《2019 - 2020 中国开发者调查报告》全面且真实地展现中国开发者及技术现状,希望对您的学习或工作有所帮助。 ———————————————— 版权声明:本文为CSDN博主「CSDN资讯」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/csdnnews/article/details/104538091
问问小秘 2020-03-11 16:46:19 0 浏览量 回答数 0

回答

一 容器 在学习k8s前,首先要了解和学习容器概念和工作原理。 什么是容器? 容器是一种轻量级、可移植、自包含的软件打包技术,使应用程序可以在几乎任何地方以相同的方式运行。开发人员在自己笔记本上创建并测试好的容器,无需任何修改就能够在生产系统的虚拟机、物理服务器或公有云主机上运行。 容器的优势 容器使软件具备了超强的可移植能力。 对于开发人员 – Build Once, Run Anywhere 容器意味着环境隔离和可重复性。开发人员只需为应用创建一次运行环境,然后打包成容器便可在其他机器上运行。另外,容器环境与所在的 Host 环境是隔离的,就像虚拟机一样,但更快更简单。 对于运维人员 – Configure Once, Run Anything 只需要配置好标准的 runtime 环境,服务器就可以运行任何容器。这使得运维人员的工作变得更高效,一致和可重复。容器消除了开发、测试、生产环境的不一致性。 Docker概念 “Docker” 一词指代了多个概念,包括开源社区项目、开源项目使用的工具、主导支持此类项目的公司 Docker Inc. 以及该公司官方支持的工具。技术产品和公司使用同一名称,的确让人有点困惑。 我们来简单说明一下: IT 软件中所说的 “Docker” ,是指容器化技术,用于支持创建和使用容器。 开源 Docker 社区致力于改进这类技术,并免费提供给所有用户,使之获益。 Docker Inc. 公司凭借 Docker 社区产品起家,它主要负责提升社区版本的安全性,并将技术进步与广大技术社区分享。此外,它还专门对这些技术产品进行完善和安全固化,以服务于企业客户。 借助 Docker,您可将容器当做轻巧、模块化的虚拟机使用。同时,您还将获得高度的灵活性,从而实现对容器的高效创建、部署及复制,并能将其从一个环境顺利迁移至另一个环境,从而有助于您针对云来优化您的应用。 Docker有三大核心概念: 镜像(Image)是一个特殊的文件系统,提供容器运行时所需的程序、库、配置等,构建后不会改变 容器(Container)实质是进程,拥有自己独立的命名空间。 仓库(Repository)一个仓库可以包含多个标签(Tag),每个标签对应一个镜像 容器工作原理 Docker 技术使用 Linux 内核和内核功能(例如 Cgroups 和 namespaces)来分隔进程,以便各进程相互独立运行。这种独立性正是采用容器的目的所在;它可以独立运行多种进程、多个应用,更加充分地发挥基础设施的作用,同时保持各个独立系统的安全性。 二 Kubernetes入门知识指南 Kubernets的知识都可以在官方文档查询,网址如下: https://kubernetes.io/zh/docs/home/ Kubernetes基础知识 Kubernetes是什么? Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的工作负载和服务,可促进声明式配置和自动化。Kubernetes 拥有一个庞大且快速增长的生态系统。Kubernetes 的服务、支持和工具广泛可用。 为什么需要 Kubernetes 容器是打包和运行应用程序的好方式。在生产环境中,您需要管理运行应用程序的容器,并确保不会停机。例如,如果一个容器发生故障,则需要启动另一个容器。如果由操作系统处理此行为,会不会更容易? Kubernetes 为您提供: 服务发现和负载均衡 Kubernetes 可以使用 DNS 名称或自己的 IP 地址公开容器,如果到容器的流量很大,Kubernetes 可以负载均衡并分配网络流量,从而使部署稳定。 存储编排 Kubernetes 允许您自动挂载您选择的存储系统,例如本地存储、公共云提供商等。 自动部署和回滚 您可以使用 Kubernetes 描述已部署容器的所需状态,它可以以受控的速率将实际状态更改为所需状态。例如,您可以自动化 Kubernetes 来为您的部署创建新容器,删除现有容器并将它们的所有资源用于新容器。 自动二进制打包 Kubernetes 允许您指定每个容器所需 CPU 和内存(RAM)。当容器指定了资源请求时,Kubernetes 可以做出更好的决策来管理容器的资源。 自我修复 Kubernetes 重新启动失败的容器、替换容器、杀死不响应用户定义的运行状况检查的容器,并且在准备好服务之前不将其通告给客户端。 密钥与配置管理 Kubernetes 允许您存储和管理敏感信息,例如密码、OAuth 令牌和 ssh 密钥。您可以在不重建容器镜像的情况下部署和更新密钥和应用程序配置,也无需在堆栈配置中暴露密钥。 Kubernetes 组件 初学者首先要了解Kubernetes的基本概念,包括master、node、pod等。 Master Master是Kubernetes集群的大脑,运行着的守护进程服务包括kube-apiserver、kube-scheduler、kube-controller-manager、etcd和Pod网络等。 kube-apiserver 主节点上负责提供 Kubernetes API 服务的组件;它是 Kubernetes 控制面的前端。 kube-apiserver 在设计上考虑了水平扩缩的需要。 换言之,通过部署多个实例可以实现扩缩。 etcd etcd 是兼具一致性和高可用性的键值数据库,可以作为保存 Kubernetes 所有集群数据的后台数据库。 您的 Kubernetes 集群的 etcd 数据库通常需要有个备份计划。 kube-scheduler 主节点上的组件,该组件监视那些新创建的未指定运行节点的 Pod,并选择节点让 Pod 在上面运行。 调度决策考虑的因素包括单个 Pod 和 Pod 集合的资源需求、硬件/软件/策略约束、亲和性和反亲和性规范、数据位置、工作负载间的干扰和最后时限。 kube-controller-manager 在主节点上运行控制器的组件。 从逻辑上讲,每个控制器都是一个单独的进程,但是为了降低复杂性,它们都被编译到同一个可执行文件,并在一个进程中运行。 这些控制器包括: 节点控制器(Node Controller): 负责在节点出现故障时进行通知和响应。 副本控制器(Replication Controller): 负责为系统中的每个副本控制器对象维护正确数量的 Pod。 端点控制器(Endpoints Controller): 填充端点(Endpoints)对象(即加入 Service 与 Pod)。 服务帐户和令牌控制器(Service Account & Token Controllers): 为新的命名空间创建默认帐户和 API 访问令牌. 云控制器管理器-(cloud-controller-manager) cloud-controller-manager 运行与基础云提供商交互的控制器 cloud-controller-manager 仅运行云提供商特定的控制器循环。您必须在 kube-controller-manager 中禁用这些控制器循环,您可以通过在启动 kube-controller-manager 时将 --cloud-provider 参数设置为 external 来禁用控制器循环。 cloud-controller-manager 允许云供应商的代码和 Kubernetes 代码彼此独立地发展。在以前的版本中,核心的 Kubernetes 代码依赖于特定云提供商的代码来实现功能。在将来的版本中,云供应商专有的代码应由云供应商自己维护,并与运行 Kubernetes 的云控制器管理器相关联。 以下控制器具有云提供商依赖性: 节点控制器(Node Controller): 用于检查云提供商以确定节点是否在云中停止响应后被删除 路由控制器(Route Controller): 用于在底层云基础架构中设置路由 服务控制器(Service Controller): 用于创建、更新和删除云提供商负载均衡器 数据卷控制器(Volume Controller): 用于创建、附加和装载卷、并与云提供商进行交互以编排卷 Node 节点组件在每个节点上运行,维护运行 Pod 并提供 Kubernetes 运行环境。 kubelet 一个在集群中每个节点上运行的代理。它保证容器都运行在 Pod 中。 kubelet 接收一组通过各类机制提供给它的 PodSpecs,确保这些 PodSpecs 中描述的容器处于运行状态且健康。kubelet 不会管理不是由 Kubernetes 创建的容器。 kube-proxy kube-proxy 是集群中每个节点上运行的网络代理,实现 Kubernetes Service 概念的一部分。 kube-proxy 维护节点上的网络规则。这些网络规则允许从集群内部或外部的网络会话与 Pod 进行网络通信。 如果有 kube-proxy 可用,它将使用操作系统数据包过滤层。否则,kube-proxy 会转发流量本身。 容器运行环境(Container Runtime) 容器运行环境是负责运行容器的软件。 Kubernetes 支持多个容器运行环境: Docker、 containerd、cri-o、 rktlet 以及任何实现 Kubernetes CRI (容器运行环境接口)。 Pod 在Kubernetes中,最小的管理元素不是一个个独立的容器,而是Pod。Pod是管理,创建,计划的最小单元. 一个Pod相当于一个共享context的配置组,在同一个context下,应用可能还会有独立的cgroup隔离机制,一个Pod是一个容器环境下的“逻辑主机”,它可能包含一个或者多个紧密相连的应用,这些应用可能是在同一个物理主机或虚拟机上。 Pod 的context可以理解成多个linux命名空间的联合 PID 命名空间(同一个Pod中应用可以看到其它进程) 网络 命名空间(同一个Pod的中的应用对相同的IP地址和端口有权限) IPC 命名空间(同一个Pod中的应用可以通过VPC或者POSIX进行通信) UTS 命名空间(同一个Pod中的应用共享一个主机名称) 同一个Pod中的应用可以共享磁盘,磁盘是Pod级的,应用可以通过文件系统调用。 由于docker的架构,一个Pod是由多个相关的并且共享磁盘的容器组成,Pid的命名空间共享还没有应用到Docker中 和相互独立的容器一样,Pod是一种相对短暂的存在,而不是持久存在的,正如我们在Pod的生命周期中提到的,Pod被安排到结点上,并且保持在这个节点上直到被终止(根据重启的设定)或者被删除,当一个节点死掉之后,上面的所有Pod均会被删除。特殊的Pod永远不会被转移到的其他的节点,作为替代,他们必须被replace. 三 通过kubeadm方式创建一个kubernetes 对kubernetes的概念和组件有所了解以后,就可以通过kubeadm的方式创建一个kubernetes集群。 安装前准备工作 创建虚拟机 创建至少2台虚拟机,可以在本地或者公有云。 下载部署软件 需要下载的软件包括calico、demo-images、docker-ce、kube、kube-images、kubectl、metrics-server 安装部署 具体安装过程参考官网文档: https://kubernetes.io/zh/docs/reference/setup-tools/kubeadm/kubeadm/ 四 安装后的练习 安装后详读官方文档,做下面这些组件的练习操作,要达到非常熟练的程度。 Node Namespace Pod Deployment DaemonSet Service Job Static Pod ConfigMap Secrets Volume Init-containers Affinity and Anti-Affinity Monitor and logs Taints and Tolerations Cordon and Drain Backing up etcd 这些内容都非常熟练以后,基本就达到了入门的水平。
红亮 2020-03-02 11:09:17 0 浏览量 回答数 0

问题

【精品问答】Java技术1000问(1)

为了方便Java开发者快速找到相关技术问题和答案,开发者社区策划了Java技术1000问内容,包含最基础的如何学Java、实践中遇到的技术问题、RocketMQ面试、Java容器部署实践等维度内容。 我们会以每...
问问小秘 2019-12-01 21:57:43 46087 浏览量 回答数 16

问题

HBase运维基础——元数据逆向修复原理

转载自:http://www.hbase.group/article/9 背景 鉴于上次一篇文章——“云HBase小组成功抢救某公司自建HBase集群,挽救30+T数据”的读者反馈,对HB...
pandacats 2019-12-18 15:08:35 3 浏览量 回答数 0

回答

工作很多年了,这次看到阿里开发者社区举办的这次打卡学习活动后,果断报名参加。有人说这次的课程太多,21天肯定学不完,其实官网宣传的资料里已经说明了这次活动举办的意义,打卡只是一种督促学习的形式,奖励只是学习之外提供的一点小甜点,不要为了奖品而打卡,真正昂贵的奖品,是课程里的知识,通过打卡活动学习的知识是无价的,是任何奖品都无法比拟的,为了学习知识而打卡,这才是这次活动的真正目的,至于21天内学不完所有课程,这也是情理之中,课程内容不少,一时难以全部学完,但21天只是一个开始,21天之后我们仍然可以学习,不仅可以学习这次活动的课程,阿里开发者社区的其他课程我们都可以学习,要知道学习是一辈子的事情,持续不断的学习能力才是一个技术人员真正核心的竞争力所在。 此次学习《Alibaba Java技术图谱》,最大的收获是对以往知识的整理与沉淀,使自己的知识体系更加的牢固。 有些人认为,这些课程讲授的知识普遍都比较简单,其中大部分都已经掌握了,没必要再学了,打个卡拿到奖品就好。其实这种观点是有待商榷的。文无第一,写程序就像写作文,没有人可以称得上自己的程序天下无双,不会再有后人突破了。技术会迭代,世界会发展,在技术分工越来越细化的时代背景下,就算是资深技术人员,也不一定懂得所有的技术细节,一些底层的技术边角地带,是鲜有人探索领略过的。我们应该重视基础,挖掘基础更深的内涵。其实基础知识的简单性只是表象,了解基础技术封装的内部复杂性,才是我们学习基础的目标,冰山模型能够很好的说明基础与复杂性的这种关系,基础就像冰山上面贴近地面的那部分,而水面下的巨大冰层,才是影响水面上可见部分的重要因素。System.out.print("Hello World"),是所有Java程序员熟知的方法,但有多少人把它研究透彻了呢,简单的表象下是巨大复杂性的封装,背后的编译器,解释器,计算机 I/O行为,CPU,寄存器,内存这些硬件背后到底都产生了哪些行为?这背后的复杂性超乎我们想象。所以说我们只是站在前人的肩膀上,简单是相对的,在应用层面的抽象层级中,一句简单的屏幕输出语句看似没有什么更多的可挖掘性,但是只要我们打破应用抽象层的界限,进入更深的抽象层次之后,就会发现另一个我们从没有探索过的天地。 以上只是通过一个简单示例说明重学基础的重要性,对于Java语言的其他特性例如,继承,接口,Lambda表达式,泛型,反射,Annotation等等,巩固并深挖这些已经学过的其他基础知识,重视基础的学习方式是仍然适用开的。仔细思考的话可以发现,学习技术知识其实有两个方向,一个是向上增加自己的应用开发知识,记住更多的函数,学会更多的框架技术,而另一个方向则是向下解构程序,学习前人的编程思想与思路。两个方向相互对立又相互统一,学习底层是为了更好的扩展自身高层应用的知识,而高层的技术需求导致已有高层技术不能满足所需要求,这就会促使底层技术的更新迭代,这也是所有技术生态的进化规律。Java 的生态体系,很好的契合了上述特点,Java 的底层构建哲学有极其深厚的理论基础,这使得 Java 技术生态的向上生长与底层扩展都有良好的支撑,实践是最好的证明,Java 这么多年也曾有过挑战者,但为什么最终被大多数企业选用的还是Java,这就是对Java 语言在企业级开发当中具有优越性的最好证明,Java 不仅是一门编程语言,还是多年来真实世界的企业领域中积累下来的经验与成果。如果有过脚本语言开发经验的开发者,就能够深刻的体会到,其他语言体系看上去似乎是东拼西凑的把多个技术与工具拼凑在一起来解决实际问题,但Java体系内的技术就和其他语言不同,Java 生态体系具有高度的一致性,从底层设计到高层构建,都依赖于这种一致性的传承,如今百花齐放的Java 生态也是依赖于此。这背后其实具有非常坚深的哲学思想,值得我们反复揣摩。 对于如此纷繁绚丽的Java技术世界,只有打好技术基础,才能逐步踏入Java的技术世界,领略五彩缤纷的技术魅力。除了这次活动的课程,还要跟大家推荐一本Java方面的书籍,就是很多人都知道的《Java 核心技术》两卷本,人们常常把这套书和《Java 编程思想》拿来对比,大家都喜欢争论到底那本书更好,对于此大家心里要有一个基本的前提,就是看书是为了提高自己的能力,而不是拿出去和其他人辩论,从而显示自己的博学。从这一点来看,什么书是好书的结论也就很明显了,能使自己提高的书就是好书。如果你是开发大牛,那么TAOCP,SCI 这样高深的经典书籍就是属于你的好书,如果你是一名刚毕业的学生,那么《七天入门XXX》这样的书籍就是你的好书,大牛也是从新手成长过来的,没有入门没有基础,就不可能成为大牛。可以看出,并不是越深越难的书就是好书,要时刻记得看书是为了提高自己这个核心目的。《Java 核心技术》与《Java 编程思想》这两本书我也全都看过,对比了一下,还是觉得《Java 核心技术》最适合想要夯实基础的人们。《Java 核心技术》的定位很明确,就是给想要了解Java 特性的开发者来阅读。而《Java 编程思想》虽然其中的代码实现语言是Java,但实际上书中所体现的代码背后的东西才是这本书想要表达的重点,这些背后的东西用C++,C# 等其他语言,也是可以描述的,所以《Java 编程思想》这本书要等到对 Java 能够熟练运用,想要继续探索更深层次的普适性编程内容的时候,读起来才会有很多的收获,否则会浪费很多的时间与精力,但却收效甚微。所以对于想要夯实基础的开发同学,用《Java 核心技术》来入门,构建好自己的基础,之后再去阅读其他的经典书籍,就不会那么困难了。 明白了这些,作为一名开发者,我们不仅应该站在巨人的肩膀上,享受前人的技术成果,也应该追本溯源,了解技术的前世今生与来龙去脉。有了这种学习方式,通过多年的工作经历,我们的技术将有极大的提升,技术视角也将进入一个质变的层次。这次活动只是一个开始,通过这个活动能够加固自身知识体系,增强自己理论学习能力,养成终身学习习惯的开发者,今后必将受用终生。 最后要提一句,如果这篇评论有幸被选中15个评论留言的其中之一,那么我想要开发者背包 ~~ 那个带logo的背包太酷啦,在网上商城搜了一下都没有卖的,所以如果可能恳请一个背包奖品名额 ~~ 最后的最后,祝大家学有所成,共享美好人生!
王冰新 2021-03-04 13:37:53 0 浏览量 回答数 0

回答

大数据是指无法在一定时间内用常规软件工具对其内容进行抓取、管理和处理的数据集合。大数据技术,是指从各种各样类型的数据中,快速获得有价值信息的能力。适用于大数据的技术,包括大规模并行处理(MPP)数据库,数据挖掘电网,分布式文件系统,分布式数据库,云计算平台,互联网,和可扩展的存储系统。   大数据有四个基本特征:一、数据体量巨大(Vomule),二、数据类型多样(Variety),三、处理速度快(Velocity),四、价值密度低(Value)。   在大数据的领域现在已经出现了非常多的新技术,这些新技术将会是大数据收集、存储、处理和呈现最强有力的工具。大数据处理一般有以下几种关键性技术:大数据采集、大数据预处理、大数据存储及管理、大数据分析及挖掘、大数据展现和应用(大数据检索、大数据可视化、大数据应用、大数据安全等)。   大数据处理之一:采集。大数据的采集是指利用多个数据库来接收发自客户端(Web、App或者传感器形式等)的数据,并且用户可以通过这些数据库来进行简单的查询和处理工作。比如,电商会使用传统的关系型数据库MySQL和Oracle等来存储每一笔事务数据,除此之外,Redis和MongoDB这样的NoSQL数据库也常用于数据的采集。   在大数据的采集过程中,其主要特点和挑战是并发数高,因为同时有可能会有成千上万的用户来进行访问和操作,比如火车票售票网站和淘宝,它们并发的访问量在峰值时达到上百万,所以需要在采集端部署大量数据库才能支撑。并且如何在这些数据库之间进行负载均衡和分片的确是需要深入的思考和设计。   大数据处理之二:导入和预处理。虽然采集端本身会有很多数据库,但是如果要对这些海量数据进行有效的分析,还是应该将这些来自前端的数据导入到一个集中的大型分布式数据库,或者分布式存储集群,并且可以在导入基础上做一些简单的清洗和预处理工作。也有一些用户会在导入时使用来自Twitter的Storm来对数据进行流式计算,来满足部分业务的实时计算需求。   导入与预处理过程的特点和挑战主要是导入的数据量大,每秒钟的导入量经常会达到百兆,甚至千兆级别。   大数据处理之三:统计和分析。统计与分析主要利用分布式数据库,或者分布式计算集群来对存储于其内的海量数据进行普通的分析和分类汇总等,以满足大多数常见的分析需求,在这方面,一些实时性需求会用到EMC的GreenPlum、Oracle的Exadata,以及基于MySQL的列式存储Infobright等,而一些批处理,或者基于半结构化数据的需求可以使用Hadoop。   统计与分析这部分的主要特点和挑战是分析涉及的数据量大,其对系统资源,特别是I/O会有极大的占用。   大数据处理之四:挖掘。与前面统计和分析过程不同的是,数据挖掘一般没有什么预先设定好的主题,主要是在现有数据上面进行基于各种算法的计算,从而起到预测(Predict)的效果,从而实现一些高级别数据分析的需求。比较典型算法有用于聚类的Kmeans、用于统计学习的SVM和用于分类的NaiveBayes,主要使用的工具有Hadoop的Mahout等。该过程的特点和挑战主要是用于挖掘的算法很复杂,并且计算涉及的数据量和计算量都很大,常用数据挖掘算法都以单线程为主。   整个大数据处理的普遍流程至少应该满足这四个方面的步骤,才能算得上是一个比较完整的大数据处理。   大数据的处理方式大致分为数据流处理方式和批量数据处理方式两种。数据流处理的方式适合用于对实时性要求比较高的场合中。并不需要等待所有的数据都有了之后再进行处理,而是有一点数据就处理一点,更多地要求机器的处理器有较快速的性能以及拥有比较大的主存储器容量,对辅助存储器的要求反而不高。批量数据处理方式是对整个要处理的数据进行切割划分成小的数据块,之后对其进行处理。重点在于把大化小——把划分的小块数据形成小任务,分别单独进行处理,并且形成小任务的过程中不是进行数据传输之后计算,而是将计算方法(通常是计算函数——映射并简化)作用到这些数据块最终得到结果。   当前,对大数据的处理分析正成为新一代信息技术融合应用的节点。移动互联网、物联网、社交网络、数字家庭、电子商务等是新一代信息技术的应用形态,这些应用不断产生大数据。通过对不同来源数据的管理、处理、分析与优化,将结果反馈到上述应用中,将创造出巨大的经济和社会价值。大数据也是信息产业持续高速增长的新引擎。面对大数据市场的新技术、新产品、新业态会不断涌现。在硬件与集成设备领域,大数据将对芯片、存储产业产生重要影响,还将催生一体化数据存储处理服务器、内存计算等市场。在软件与服务领域,大数据将引发数据快速处理分析、数据挖掘技术和软件产品的发展。大数据利用将成为提高核心竞争力的关键因素。各行各业的决策正在从“业务驱动”转变为“数据驱动”。对大数据的分析可以使零售商实时掌握市场动态并迅速做出应对;可以为商家制定更加精准有效的营销策略提供决策支持;可以帮助企业为消费者提供更加及时和个性化的服务;在医疗领域,可提高诊断准确性和药物有效性;在公共事业领域,大数据也开始发挥促进经济发展、维护社会稳定等方面的重要作用。大数据时代科学研究的方法手段将发生重大改变。例如,抽样调查是社会科学的基本研究方法。在大数据时代,可通过实时监测,跟踪研究对象在互联网上产生的海量行为数据,进行挖掘分析,揭示出规律性的东西,提出研究结论和对策。   目前大数据在医疗卫生领域有广为所知的应用,公共卫生部门可以通过覆盖全国的患者电子病历数据库进行全面疫情监测。5千万条美国人最频繁检索的词条被用来对冬季流感进行更及时准确的预测。学术界整合出2003年H5N1禽流感感染风险地图,研究发行此次H7N9人类病例区域。社交网络为许多慢性病患者提供了临床症状交流和诊治经验分享平台,医生借此可获得院外临床效果统计数据。基于对人体基因的大数据分析,可以实现对症下药的个性化治疗。   在医药研发方面,大数据的战略意义在于对各方面医疗卫生数据进行专业化处理,对患者甚至大众的行为和情绪的细节化测量成为可能,挖掘其症状特点、行为习惯和喜好等,找到更符合其特点或症状的药品和服务,并针对性的调整和优化。在医药研究开发部门或公司的新药研发阶段,能够通过大数据技术分析来自互联网上的公众疾病药品需求趋势,确定更为有效率的投入产品比,合理配置有限研发资源。除研发成本外,医药公司能够优化物流信息平台及管理,更快地获取回报,一般新药从研发到推向市场的时间大约为13年,使用数据分析预测则能帮助医药研发部门或企业提早将新药推向市场。   在疾病诊治方面,可通过健康云平台对每个居民进行智能采集健康数据,居民可以随时查阅,了解自身健康程度。同时,提供专业的在线专家咨询系统,由专家对居民健康程度做出诊断,提醒可能发生的健康问题,避免高危病人转为慢性病患者,避免慢性病患者病情恶化,减轻个人和医保负担,实现疾病科学管理。对于医疗卫生机构,通过对远程监控系统产生数据的分析,医院可以减少病人住院时间,减少急诊量,实现提高家庭护理比例和门诊医生预约量的目标。武汉协和医院目前也已经与市区八家社区卫生服务中心建立远程遥控联系,并将在未来提供“从医院到家”的服务。在医疗卫生机构,通过实时处理管理系统产生的数据,连同历史数据,利用大数据技术分析就诊资源的使用情况,实现机构科学管理,提高医疗卫生服务水平和效率,引导医疗卫生资源科学规划和配置。大数据还能提升医疗价值,形成个性化医疗,比如基于基因科学的医疗模式。   在公共卫生管理方面,大数据可以连续整合和分析公共卫生数据,提高疾病预报和预警能力,防止疫情爆发。公共卫生部门则可以通过覆盖区域的卫生综合管理信息平台和居民信息数据库,快速监测传染病,进行全面疫情监测,并通过集成疾病监测和响应程序,进行快速响应,这些都将减少医疗索赔支出、降低传染病感染率。通过提供准确和及时的公众健康咨询,将会大幅提高公众健康风险意识,同时也将降低传染病感染风险。   在居民健康管理方面,居民电子健康档案是大数据在居民健康管理方面的重要数据基础,大数据技术可以促进个体化健康事务管理服务,改变现代营养学和信息化管理技术的模式,更全面深入地从社会、心理、环境、营养、运动的角度来对每个人进行全面的健康保障服务,帮助、指导人们成功有效地维护自身健康。另外,大数据可以对患者健康信息集成整合,在线远程为诊断和治疗提供更好的数据证据,通过挖掘数据对居民健康进行智能化监测,通过移动设备定位数据对居民健康影响因素进行分析等等,进一步提升居民健康管理水平。   在健康危险因素分析方面,互联网、物联网、医疗卫生信息系统及相关信息系统等普遍使用,可以系统全面地收集健康危险因素数据,包括环境因素(利用GIS系统采集大气、土壤、水文等数据),生物因素(包括致病性微生物、细菌、病毒、真菌等的监测数据),经济社会因素(分析经济收入、营养条件、人口迁徙、城镇化、教育就业等因素数据),个人行为和心理因素,医疗卫生服务因素,以及人类生物遗传因素等,利用大数据技术对健康危险因素进行比对关联分析,针对不同区域、人群进行评估和遴选健康相关危险因素及制作健康监测评估图谱和知识库也成为可能,提出居民健康干预的有限领域和有针对性的干预计划,促进居民健康水平的提高。 答案来源于网络
养狐狸的猫 2019-12-02 02:15:59 0 浏览量 回答数 0

回答

在校生要找到好工作,主要靠几个光环,学校光环、竞赛光环、项目光环、实习光环。其中项目经验尤为重要。有些同学就有疑问了: “我校招没offer,没有项目经验,是不是要报个培训班?” “我转行计算机,是不是应该报个班?” “我也想自学,可怎么学啊,选哪个方向啊?” 对于有些同学,当我还在想办法劝他自学时,给我贴出了培训班的广告词,真可谓,人有多大胆,口号就有多不要脸: “0基础入学,三个月包就业” “毕业月入不过万,不收学费” “从前是你找工作,接下来是工作找你” 当我推荐某些同学去培训时,又给咔咔咔亮出了几个帖子,说培训出来的受歧视啊、有些同学培训出来还是找不到工作啊,等等。 其实,选择自学还是培训是看自身情况而定,无论选择自学还是培训,都只是入门的一种手段,各有优劣势,本文就详细说说自学/培训怎么选,选择以后怎么办,记得帮我点赞哦。   目录: 自学还是培训,怎么选? 自学怎么学? 培训班到底在培训什么? 有些企业歧视培训班学员,培训班的问题到底出在哪? 一些建议 一、自学还是培训,怎么选? 无论你是什么学历、有没有计算机基础,这些都不是决定你适合自学的条件,具备如下三个条件的人都可以选择自学: (1)、时间充足 如果说从零基础靠自学达到找工作的水平,需要多久呢?我觉得至少一年,有的人可能需要两年。所以,如果你是大一、大二、大三的学生,你还有时间,可以选择自学。如果你是已经工作的,想转行计算机,可以边工作边学习,这个过程会比较辛苦,但也不是绝对不可行。 对于大四的同学,以就业为导向,建议你去培训。不可否认,培训是最快入门的方式,对于时间不足的同学而言,培训是最优解。同样地,如果你是已工作的,不存在财务压力,我同样建议你去培训,工作后的时间很珍贵,比不上在校期间有大把时间可以浪费,如果做好了必转的决心,以最快速度转行才是最优解。 (2)、自控力强 能管得住自己,自己定的目标能想尽一切办法实现的同学,真不多,能占人群中1/4已经不错了。 有些人学了半小时就会累,休息一会,就成这样: 我见过太多的半途而废的同学,也见过太多自己安慰自己式的学习方式,但就业就是一个试金石,你这段时间的努力有没有回报,去找工作的时候,就水落石出。 如果在自律这方面不太行的话,可以看下这篇文章,《启舰:你是怎么变自律的?》,找到自已的驱动器,完成自己的梦想。 (3)、具备高中以上学历 计算机本身是数学家发明的,或多或少会用到一些基本的数学知识、经常用到的很多算法都是数学知识的延伸,没有基本的数学功底,自学确实很难。 至于英语阅读能力还好说,只要会用有道词典,不会的去搜去看,总会读懂的,而且入门级的文献和视频中文版的资料已足够你入门,英语应该不是太大的问题。 如果你这三点都满足,恭喜你,你具有了自学的基础,可以选择自学。 二、自学怎么学? 1、选定一个方向 首先,我们选择方向的目的是什么?不就是为了找份工作吗?那直接到招聘类网站去搜下相关的岗位数量及要求不就好了,哪个数量多,自己也喜欢,那就选这个即可。 其次,如果是大三、大四即将毕业的同学,想知道最近哪个岗位好找工作的话。还可以看看很多培训机构的培训内容,现在很多培训机构都声称保就业,真的以为,培训几个月能培训出朵花来吗?不可能的,编程是个需要长期训练的活,几个月的培训,仅是入门而已,入门的水平能保证找份工作,就靠的是这个岗位门槛低,需求大,好找工作。 如果实在不知道选什么,我帮你找几个方向:python、java后端、Html5就业岗位都挺多,就业门槛低,相对好就业,如果也有其它方向推荐,大家可以留言。 2、找到几套视频教材 在入门时强烈不建议跟着书学 第一,不一定能看得懂 第二,书本的知识不成体系,入门有入门的书,进阶有进阶的书,实战有实战的书,需要自己去选择,本身就不是一件易事。 第三,视频可以看到老师的操作,而书本全靠自己摸 现在某某培训班的入门、进阶、实战的系列视频不要太好找,找到这么两套视频,对比着看,或者跟着一套视频深入看,来得更容易。人家培训班安排好的路线跟着学,不懂的自己搜,就已经排除了自已给自己安排路线的难点,况且人家本身就是面向就业的,培训出来的同学能保就业,只要你能跟着学通学会,自然找到工作也不是问题。 我精心整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!! 只要关注微信公众号【启舰杂谈】后回复你所需方向的关键字即可,比如『Android』、『java』、『ReactNative』、『H5』、『javaweb』、『面试』、『机器学习』、『web前端』、『设计模式』等关键字获取对应资料。(所有资料免费送,转发宣传靠大家自愿) 视频内容非常多,总共2184G、一千六百多册电子书,九百多套视频教程,涉及43个方向。我整理了很长时间,有些资料是靠买的,希望大家能最快的提升自己。帮我点个赞吧。 启舰:全网2184G计算机各方向视频教程/电子书汇总(持续更新中)​   3、自学,除了知识,你还能学到什么? 自学的缺点很明显: 第一:速度慢,所有进度完全靠自己把控,没有氛围 第二:遇到问题需要自己解决,无人请教 那优点恰恰是从这些缺点中磨练出来的,进度靠自己把握,完全磨练了你的意志力。而所有问题靠自己解决,恰恰培养了你的解决问题的能力。 而这些能力都是培训班教不出来的、无法速成的。而这些能力却是真正的开发高手所必备的 问题定义、分析与设计阶段,这是最需要智商、创造力和经验的阶段,真正的开发高手,就是在这一阶段体现出远超普通人的水平,而在这一阶段所需要的能力,对不起,培训班教不出来,也无法速成,只能靠人自己的努力,慢慢地培养和增强。 4、自学建议 (1)、多做笔记、多复习 刚开始学习时,很难,真的很难。很多东西听不懂,很多东西需要自己搜,自己定的进度很可能完不成。 没关系,坚持下去,都是这么过来的。我刚开始自学的时候,也是无数次想死的冲动…… 学会做笔记,把自己学到的东西及时记下来,形成目录,在后面用到的时候,根据笔记再去看一遍,刚开始经常会出现,听得懂,跟着学会,自己弄就不会的现象。这都是正常的,技术本就是个熟能生巧的过程。 多动手,多总结,就慢慢熟练了。 (2)、多写代码!听得懂、看得懂,并没什么用 入门级知识,本就是语法和框架的熟悉过程,说到底就是工具的使用方法熟悉的过程。既然是工具,那就必然要多用。熟能生巧,指的是用的熟。很多同学看的懂,听的会,自己一下手就问题百出,就是练的少! (3)、听不懂,搜一下,再不懂就放过 刚学的时候很多概念听不懂,没关系,自己搜一下,能理解了就理解,理解不了就算。听一遍就行,学到后面的时候,你就懂些了回头,再看看那些知识,基本上你都懂了。 (4)、多写注释 刚开始的时候,很多逻辑弄不懂,没关系,自己把代码拆解,并对其加以注释,这样,你在反过来再看这些代码时,能很快弄懂它的逻辑。你要知道,你后面学习时还是会碰到这些知识的,而在只看一遍的情况下是不可能记得住的,到时候,你还是会返回来复习这些知识的。 增加注释,看起来浪费时间,其实是整理代码逻辑的过程。浑浑噩噩敲出来的代码,自己都不明白什么意思的话,其实相当于没有真正学会。 三、培训班到底在培训什么? 去培训的主要原因,说到底还是因为自己啥都不会。但不会与不会间是有区别的。 对于科班出身的,上学又好好学了的同学,虽然他们没有系统的编程知识,没有项目经验,但他们有计算机基础,他懂得操作系统原理、数据结构与算法等原理性知识。 而对于跨专业和在玩了四年的同学而言,那才是真正的零基础。 而对于培训机构而言,它的责任就是让你实现从0到1的入门过程,而有经验的老鸟都知道,编程入门仅仅是知识的堆积,并没有什么技巧性可言。所有的语法和框架运用,简单来说,就是学会编程套路,学习工具使用。 而培训机构的责任,就是把这些套路教给你。只要你不太笨,经过几个月的强化训练,大部分人都能学得会。 所以,培训班教你的就是工具的使用,目的,就是以最快的速度塞给你,助你找到工作。 四、有些企业歧视培训班学员,培训班的问题到底出在哪? 培训机构有着熟练的授课体系,老师手把手答疑,让你在学习路上没有一丁点的思考时间,为的就是以最快的速度让你达标,好结课,开始下一波培训。 1、问题就出在速度上。 认知科学的研究成果表明,知识的消化与吸收,职业技能的学习与精通,本质上是在大脑神经元之间建立连接,重塑大脑结构的过程,这个过程的时间可以缩短,但不能无限地缩短。另外,不同的人,拥有不同的背景和基础,在学习与掌握相同的知识与职业技能时,所花的时间是不一样的。 而培训机构才不管这些,他的目的就是挣钱,以最快的速度挣钱,能在三天内把所有内容塞给你绝不用四天,只要最终能糊弄住面试官,让学员找到一份工作就可以了。 所以,必然会出现下面的现象: 对于原来有一些基础的,学习能力较强的同学,在学习之前已经有较扎实的基础,所以在培训期间能够自己构建成技术体系,知识吸收相对较好: 而另一些学员,则会出现消化不良的情况: 2、培训后遗症 对于软件开发而言,所有的软件开发都大致分为两个阶段: 1、分析、定义、设计阶段。这个阶段是需要有解决问题、分析问题的能力。而这个能力培训班培训不出来,只能是慢慢增强。 2、语法、工具的使用,将设计的内容实现出来。这一块就比较机械了,工具嘛,学一学都能会,培训班在这一块的效率是很高效的,它们多半能在较短的时间内,教会学员特定编程语言(比如Python)特定工具(比如Git)与特定技术的使用(比如Spring MVC),并且传授给他们一些开发的“套路”(比如分层架构与设计模式),从而将学员成功地培养成为一个能够“搬砖”的软件工人,即初级程序员。 培训班一般都会选择门槛低、就业岗位多的方向进行培训,对于这类岗位,人才缺口大,只要能直接上手写代码的初级程序员,都很容易找到一份工作。这也就是为什么培训班多半会收学生五位数的学费,而学生也愿意支付的根本原因。 (1)、解决问题能力差,动不动就得人教 经过几个月饭来张口、衣来伸手的填鸭式集训,有些人在工作后,却依然认为,当他遇到问题时,从来不想着自己搜搜资料解决,而是依赖同事帮他答疑! 自学能力差、解决问题能力差,是很多人找到了工作,过不了试用期的根本原因。 (2)、培训效果立竿见影,却又很快遗忘 任何的知识都是一样,短时间内填鸭式学到的知识,在一段时间不用后,就会遗忘。这就是有些同学刚从培训班出来时,能找到份工作,当学到的东西在工作中几个月用不到时,就很快忘记,总觉得自己还是啥都不会的原因。 永远要记住:学历不行靠实力,实力不行靠态度!!! 当我们初入职场,尽心尽责地把自己的工作做完做好的同时,千万不要忘记像海绵一样,以最快的速度给自己充水。 像培训完的同学,在校期间已经做了很多的笔记,工作之余,多复习,重新练,利用时间将它理解,真正内化为自己的本领。 对于自学的同学,多找进阶性书籍和视频去看,以最快的速度提升自己。 文末我整理了计算机各个方向的从入门、进阶、实战的视频课程和电子书,都是技术学习路上必备的经验,跟着视频学习是进步最快的,而且所有课程都有源码,直接跟着去学!!! 五、一些建议 1、非科班同学建议 对于非科班转行计算机的同学,有太多的知识需要补足,如果你靠的是自学,需要强有力的自律能力,只要时间还够,是可以靠自学的,在跟着视频学的时候,哪里听不懂及时去搜相关的资料去补足。 刚开始自学时,即便是科班出身也是有想死的冲动的,大家都一样。我也是靠自学过来的,很多的东西不会,很多的东西听不懂。没关系,多做笔试,多搜资料,把不会的弄会,你会发现,学习起来越来越容易。 所有的困难只不过是纸老虎,坚持过去就成功了。 如果你是通过培训找到了一份工作,你需要比别人更努力补充计算机知识,基础知识的缺乏,会使你很难在这条路上走很远,所有的大神,都是自学能力很强的人,你想,你也可以。 2、所有开发方向都必须从C++开始? 经常会有要校生问我:我要做H5开发,是不是要先学C++? 其实,各个语言之间是没有任何关联的,完全都是有各自的语法体系和开发工具的,简单来讲,他们都是不同类型的工具。 你学会一种工具,只会对另一种类似的工具更容易上手,而不是完全不用学。所以,想学哪个方向,直接去学就行了,没必须先从C++入手迂回一下,纯属浪费时间。 但,如果你还在上学,现在正在学C++,那我还是建议你好好学,必须C语言语法更接近低层编译器原理,学会了它,对理解低层分配、释放、编译机制都是很有用的,但就以工作为导向而言,如果你不从事C++相关工作,是没必要学的。 3、培训出来人人工资过万? 有个男生非常沮丧的找我,自己是专科毕业,培训完,小公司不想进,大点的公司进不去,给的工资也不高,问我怎么办? 上面我们已经讲到,对于不同程度的同学,在培训出来的结果是不一样的,你要分清,你培训完的情况是属于这种: 还是这种? 对于没有名校光环的同学,建议以先就业为主。 别看培训班招你的时候给你洗脑,培训完人人过万,但能不能过万,最终靠的是自己,而不是培训班。 认请自己的情况,可以先就业,再优化自己履历,而进步步高升。 4、建议不要暴露自己的培训经历 你百度、知乎搜一下,遍地的培训歧视,很多公司根本不要培训出来的同学. 业界对培训有偏见,因为写代码是一个逐渐学习、熟练的过程,经过几个月集中的培训,虽然看起来什么都接触到了,但真正能内化为自己知识的部分其实不多。在工作中并不能熟练运用,仅是入门水平而已。 而且大家普遍认为参加培训的主要原因是因为,大学中没好好学,临近毕业了,催熟一把。不然,谁会花这几万块钱呢?对普通家庭而言,其实也并不是个小数目了。 有一个外包公司的朋友,技术总监,招人时培训公司出来都不要,原因就是干活能力不行。当然这仅代表个例,但大家需要注意的是,业界并不认为培训是一件光彩的事,千万不要搞错了!!! 5、培训班防骗三十六计 现在太多的培训机构,一个个把自己吹的天花乱坠,我也建议过小伙伴去培训,但小孩子交完钱培训一个月就退费了,深感自己好心做了坏事,这里建议大家培训市场,鱼龙混杂,一定要提前做好防骗准备。 谎言之所以真实是因为年青的心太不甘寂寞,太急于求成! 从网上找了,培训班防骗三十六计,供大家参考: “借刀杀人”:培训班间竞争激烈,彼此勾心斗角,正好为我所用。去培训班甲问乙如何,到培训班乙打听甲。Ha.Ha..,狗咬狗开始了,一时间内幕迭报:乙设备不全,很多实验不能做;甲的那个号称CCIE的老师只过了笔试,没过实验室,假的! “声东击西”:与甲约好星期六考察学校,结果星期X跑去(1=< X <= 5)。   “你怎么来了?”   “我星期六有事,所以提前来看看……” “抛砖引玉”:有时候,拿不定注意或者培训班在外地,实地考察有难度,何不到论坛发个帖子征求意见,要是能得到已经培训过的前辈的释疑,那你绝对是不虚此帖了! “假痴不癫”:有时候你可能偶然拥有一些内幕消息,不如试试他们的诚实度。   “听说你们的教师是CCIE!”   “那当然,技术首屈一指,……”   此时此刻,看着乙那得意样样的小样,不知是好笑,还是可气。不过记住:一个没有诚信的公司是什么都干的出来的! “反间计”:一个卑鄙的培训班后面一般都有一个卑鄙的流氓大亨,他不仅千方百计的从学员那里榨取钱财,对自己的手下也不会心慈手软,本着人们内部矛盾的原则发展一个或多个间谍。 “走为上计”:经过一番打探,知道他们都不是东西,还犹豫什么?宁缺毋滥,走人! 最后,如论怎么选,自终也只是入门阶段,为了找到一份工作。对于初入职场的你们,给一条最终建议:学校不行靠实力,实力不行靠态度。记得帮我点赞哦。 ———————————————— 版权声明:本文为CSDN博主「启舰」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/harvic880925/article/details/103413853
问问小秘 2020-01-07 10:55:15 0 浏览量 回答数 0

回答

Layout Go工程项目的整体组织 首先我们看一下整个 Go 工程是怎么组织起来的。 很多同事都在用 GitLab 的,GitLab 的一个 group 里面可以创建很多 project。如果我们进行微服务化改造,以前很多巨石架构的应用可能就拆成了很多个独立的小应用。那么这么多小应用,你是要建 N 个 project 去维护,还是说按照部门或者组来组织这些项目呢?在 B 站的话,我们之前因为是 Monorepo,现在是按照部门去组织管理代码,就是说在单个 GitLab 的 project 里面是有多个 app 的,每一个 app 就表示一个独立的微服务,它可以独立去交付部署。所以说我们看到下面这张图里面,app 的目录里面是有好多个子目录的,比方说我们的评论服务,会员服务。跟 app 同级的目录有一个叫 pkg,可以存放业务有关的公共库。这是我们的一个组织方式。当然,还有一种方式,你可以按照 GitLab 的 project 去组织,但我觉得这样的话可能相对要创建的 project 会非常多。 如果你按部门组织的话,部门里面有很多 app,app 目录怎么去组织?我们实际上会给每一个 app 取一个全局唯一名称,可以理解为有点像 DNS 那个名称。我们对业务的命名也是一样的,我们基本上是三段式的命名,比如账号业务,它是一个账号业务、服务、子服务的三段命名。三段命名以后,在这个 app 目录里面,你也可以按照这三层来组织。比如我们刚刚说的账号目录,我可能就是 account 目录,然后 VIP,在 VIP 目录下可能会放各种各样的不同角色的微服务,比方说可能有一些是做 job,做定时任务或者流式处理的一些任务,有可能是做对外暴露的 API 的一些服务,这个就是我们关于整个大的 app 的组织的一种形式。 微服务中的 app 服务分类 微服务中单个 app 的服务里又分为几类不同的角色。我们基本上会把 app 分为 interface(BFF)、service、job(补充:还有一个 task,偏向定时执行,job 偏向流式) 和 admin。 Interface 是对外的业务网关服务,因为我们最终是面向终端用户的 API,面向 app,面向 PC 场景的,我们把这个叫成业务网关。因为我们不是统一的网关,我们可能是按照大的业务线去独立分拆的一些子网关,这个的话可以作为一个对外暴露的 HTTP 接口的一个目录去组织它的代码,当然也可能是 gRPC 的(参考 B 站对外的 gRPC Moss 分享)。 Service 这个角色主要是面向对内通信的微服务,它不直接对外。也就是说,业务网关的请求会转发或者是会 call 我们的内部的 service,它们之间的通讯可能是使用自己的 RPC,在 b 站我们主要是使用 gRPC。使用 gRPC 通讯以后,service 它因为不直接对外,service 之间可能也可以相互去 call。 Admin 区别于 service,很多应用除了有面向用户的一些接口,实际上还有面向企业内部的一些运营侧的需求,通常数据权限更高,从安全设计角度需要代码物理层面隔离,避免意外。 第四个是 ecode。我们当时也在内部争论了很久,我们的错误码定义到底是放在哪里?我们目前的做法是,一个应用里面,假设你有多种角色,它们可能会复用一些错误码。所以说我们会把我们的 ecode 给单独抽出来,在这一个应用里面是可以复用的。注意,它只在这一个应用里面复用,它不会去跨服跨目录应用,它是针对业务场景的一个业务错误码的组织。 App 目录组织 我们除了一个应用里面多种角色的这种情况,现在展开讲一下具体到一个 service 里面,它到底是怎么组织的。我们的 app 目录下大概会有 api、cmd、configs、 internal 目录,目录里一般还会放置 README、CHANGELOG、OWNERS。 API 是放置 api 定义以及对应的生成的 client 代码,包含基于 pb 定义(我们使用 PB 作为 DSL 描述 API) 生成的 swagger.json。 而 cmd,就是放 main 函数的。Configs 目录主要是放一些服务所需的配置文件,比方说说我们可能会使用 TOML 或者是使用 YAML 文件。 Internal 的话,它里面有四个子目录,分别是 model、dao、service 和 server。Model 的定位职责就是对我们底层存储的持久化层或者存储层的数据的映射,它是具体的 Go 的一个 struct。我们再看 dao,你实际就是要操作 MySQL 或者 Redis,最终返回的就是这些 model(存储映射)。Service 组织起来比较简单,就是我们通过 dao 里面的各个方法来完成一个完整的业务逻辑。我们还看到有个 server,因为我一个微服务有可能企业内部不一定所有 RPC 都统一,那我们处于过渡阶段,所以 server 里面会有两个小目录,一个是 HTTP 目录,暴露的是 HTTP 接口,还有一个是 gRPC 目录,我们会暴露 gRPC 的协议。所以在 server 里面,两个不同的启动的 server,就是说一个服务和启动两个端口,然后去暴露不同的协议,HTTP 接 RPC,它实际上会先 call 到 service,service 再 call 到 dao,dao 实际上会使用 model 的一些数据定义 struct。但这里面有一个非常重要的就是,因为这个结构体不能够直接返回给我们的 api 做外对外暴露来使用,为什么?因为可能从数据库里面取的敏感字段,当我们实际要返回到 api 的时候,可能要隐藏掉一些字段,在 Java 里面,会抽象的一个叫 DTO 的对象,它只是用来传输用的,同理,在我们 Go 里面,实际也会把这些 model 的一些结构体映射成 api 里面的结构体(基于 PB Message 生成代码后的 struct)。 Rob Pike 当时说过的一句话,a little copying is better than a little dependency,我们就遵循了这个理念。在我们这个目录结构里面,有 internal 目录,我们知道 Go 的目录只允许这个目录里面的人去 import 到它,跨目录的人实际是不能直接引用到它的。所以说,我们看到 service 有一个 model,那我的 job 代码,我做一些定时任务的代码或者是我的网关代码有可能会映射同一个 model,那是不是要把这个 model 放到上一级目录让大家共享?对于这个问题,其实我们当时内部也争论过很久。我们认为,每一个微服务应该只对自己的 model 负责,所以我们宁愿去做一小部分的代码 copy,也不会去为了几个服务之间要共享这一点点代码,去把这个 model 提到和 app 目录级别去共用,因为你一改全错,当然了,你如果是拷贝的话,就是每个地方都要去改,那我们觉得,依赖的问题可能会比拷贝代码相对来说还是要更复杂的。 这个是一个标准的 PB 文件,就是我们内部的一个 demo 的 service。最上面的 package 是 PB 的包名,demo.service.v1,这个包使用的是三段式命名,全局唯一的名称。那这个名称为什么不是用 ID?我见过有些公司对内部做的 CMDB 或者做服务树去管理企业内部微服务的时候,是用了一些名称加上 ID 来搞定唯一性,但是我们知道后面那一串 ID 数字是不容易被传播或者是不容易被记住的,这也是 DNS 出来的一个意义,所以我们用绝对唯一的一个名称来表示这个包的名字,在后面带上这一个 PB 文件的版本号 V1。 我们看第二段定义,它有个 Service Demo 代码,其实就表示了我们这个服务要启动的服务的一个名称,我们看到这个服务名称里面有很多个 RPC 的方法,表示最终这一个应用或者这个 service 要对外暴露这几个 RPC 的方法。这里面有个小细节,我们看一下 SayHello 这个方法,实际它有 option 的一个选项。通过这一个 PB 文件,你既可以描述出你要暴露的是 gRPC 协议,又暴露出 HTTP 的一个接口,这个好处是你只需要一个 PB 文件描述你暴露的所有 api。我们回想一下,我们刚刚目录里面有个 api 目录,实际这里面就是放这一个 PB 文件,描述这一个工程到底返回的接口是什么。不管是 gRPC 还是 HTTP 都是这一个文件。还有一个好处是什么?实际上我们可以在 PB 文件里面加上很多的注释。用 PB 文件的好处是你不需要额外地再去写文档,因为写文档和写服务的定义,它本质上是两个步骤,特别容易不一致,接口改了,文档不同步。我们如果基于这一个 PB 文件,它生成的 service 代码或者调用代码或者是文档都是唯一的。 依赖顺序与 api 维护 就像我刚刚讲到的,model 是一个存储层的结构体的一一映射,dao 处理一些数据读写包,比方说数据库缓存,server 的话就是启动了一些 gRPC 或者 HTTP Server,所以它整个依赖顺序如下:main 函数启动 server,server 会依赖 api 定义好的 PB 文件,定义好这些方法或者是服务名之后,实际上生成代码的时候,比方说 protocbuf 生成代码的时候,它会把抽象 interface 生成好。然后我们看一下 service,它实际上是弱依赖的 api,就是说我的 server 启动以后,要注册一个具体的业务代码的逻辑,映射方法,映射名字,实际上是弱依赖的 api 生成的 interface 的代码,你就可以很方便地启动你的 server,把你具体的 service 的业务逻辑给注入到这个 server,和方法进行一一绑定。最后,dao 和 service 实际上都会依赖这个 model。 因为我们在 PB 里面定义了一些 message,这些 message 生成的 Go 的 struct 和刚刚 model 的 struct 是两个不同的对象,所以说你要去手动 copy 它,把它最终返回。但是为了快捷,你不可能每次手动去写这些代码,因为它要做 mapping,所以我们又把 K8s 里类似 DeepCopy 的两个结构体相互拷贝的工具给抠出来了,方便我们内部 model 和 api 的 message 两个代码相互拷贝的时候,可以少写一些代码,减少一些工作量。 上面讲的就是我们关于工程的一些 layout 实践。简单回溯一下,大概分为几块,第一就是 app 是怎么组织的,app 里面有多种角色的服务是怎么组织的,第三就是一个 app 里面的目录是怎么组织的,最后我重点讲了一下 api 是怎么维护的。 Unittest 测试方法论 现在回顾一下单元测试。我们先看这张图,这张图是我从《Google 软件测试之道》这本书里面抠出来的,它想表达的意思就是最小型的测试不能给我们的最终项目的质量带来最大的信心,它比较容易带来一些优秀的代码质量,良好的异常处理等等。但是对于一个面向用户场景的服务,你只有做大型测试,比方做接口测试,在 App 上验收功能的这种测试,你应用交付的信心可能会更足。这个其实要表达的就是一个“721 原则”。我们就是 70% 写小型测试,可以理解为单元测试,因为它相对来说好写,针对方法级别。20% 是做一些中型测试,可能你要连调几个项目去完成你的 api。剩下 10% 是大型测试,因为它是最终面向用户场景的,你要去使用我们的 App,或者用一些测试 App 去测试它。这个就是测试的一些简单的方法论。 单元测试原则 我们怎么去对待 Go 里面的单元测试?在《Google 软件测试之道》这本书里面,它强调的是对于一个小型测试,一个单元测试,它要有几个特质。它不能依赖外部的一些环境,比如我们公司有测试环境,有持续集成环境,有功能测试环境,你不能依赖这些环境构建自己的单元测试,因为测试环境容易被破坏,它容易有数据的变更,数据容易不一致,你之前构建的案例重跑的话可能就会失败。 我觉得单元测试主要有四点要求。第一,快速,你不能说你跑个单元测试要几分钟。第二,要环境一致,也就是说你跑测试前和跑测试后,它的环境是一致的。第三,你写的所有单元测试的方法可以以任意顺序执行,不应该有先后的依赖,如果有依赖,也是在你测试的这个方法里面,自己去 setup 和 teardown,不应该有 Test Stub 函数存在顺序依赖。第四,基于第三点,你可以做并行的单元测试,假设我写了一百个单元测试,一个个跑肯定特别慢。 doker-compose 最近一段时间,我们演进到基于 docker-compose 实现跨平台跨语言环境的容器依赖管理方案,以解决运行 unittest 场景下的容器依赖问题。 首先,你要跑单元测试,你不应该用 VPN 连到公司的环境,好比我在星巴克点杯咖啡也可以写单元测试,也可以跑成功。基于这一点,Docker 实际上是非常好的解决方式。我们也有同学说,其他语言有一些 in-process 的 mock,是不是可以启动 MySQL 的 mock ,然后在 in-process 上跑?可以,但是有一个问题,你每一个语言都要写一个这样的 mock ,而且要写非常多种,因为我们中间件越来越多,MySQL,HBase,Kafka,什么都有,你很难覆盖所有的组件 Mock。这种 mock 或者 in-process 的实现不能完整地代表线上的情况,比方说,你可能 mock 了一个 MySQL,检测到 query 或者 insert ,没问题,但是你实际要跑一个 transaction,要验证一些功能就未必能做得非常完善了。所以基于这个原因,我们当时选择了 docker-compose,可以很好地解决这个问题。 我们对开发人员的要求就是,你本地需要装 Docker,我们开发人员大部分都是用 Mac,相对来说也比较简单,Windows 也能搞定,如果是 Linux 的话就更简单了。本地安装 Docker,本质上的理解就是无侵入式的环境初始化,因为你在容器里面,你拉起一个 MySQL,你自己来初始化数据。在这个容器被销毁以后,它的环境实际上就满足了我们刚刚提的环境一致的问题,因为它相当于被重置了,也可以很方便地快速重置环境,也可以随时随地运行,你不需要依赖任何外部服务,这个外部服务指的是像 MySQL 这种外部服务。当然,如果你的单元测试依赖另外一个 RPC 的 service 的话,PB 的定义会生成一个 interface,你可以把那个 interface 代码给 mock 掉,所以这个也是能做掉的。对于小型测试来说,你不依赖任何外部环境,你也能够快速完成。 另外,docker-compose 是声明式的 API,你可以声明你要用 MySQL,Redis,这个其实就是一个配置文件,非常简单。这个就是我们在单元测试上的一些实践。 我们现在看一下,service 目录里面多了一个 test 目录,我们会在这个里面放 docker-compose 的 YAML 文件来表示这次单元化测试需要初始化哪些资源,你要构建自己的一些测试的数据集。因为是这样的,你是写 dao 层的单元测试的话,可能就需要 database.sql 做一些数据的初始化,如果你是做 service 的单元测试的话,实际你可以把整个 dao 给 mock 掉,我觉得反而还相对简单,所以我们主要针对场景就是在 dao 里面偏持久层的,利用 docker-compose 来解决。 容器的拉起,容器的销毁,这些工作到底谁来做?是开发同学自己去拉起和销毁,还是说你能够把它做成一个 Library,让我们的同学写单元测试的时候比较方便?我倾向的是后者。所以在我们最终写单元测试的时候,你可以很方便地 setup 一个依赖文件,去 setup 你的容器的一些信息,或者把它销毁掉。所以说,你把环境准备好以后,最终可以跑测试代码也非常方便。当然我们也提供了一些命令函,就是 binary 的一些工具,它可以针对各个语言方便地拉起容器和销毁容器,然后再去执行代码,所以我们也提供了一些快捷的方式。 刚刚我也提到了,就是我们对于 service 也好,API 也好,因为依赖下层的 dao 或者依赖下层的 service,你都很方便 mock 掉,这个写单元测试相对简单,这个我不展开讲,你可以使用 GoMock 或者 GoMonkey 实现这个功能。 Toolchain 我们利用多个 docker-compose 来解决 dao 层的单元测试,那对于我刚刚提到的项目的一些规范,单元测试的一些模板,甚至是我写了一些 dao 的一些占位符,或者写了一些 service 代码的一些占位符,你有没有考虑过这种约束有没有人会去遵循?所以我这里要强调一点,工具一定要大于约束和文档,你写了约束,写了文档,那么你最终要通过工具把它落实。所以在我们内部会有一个类似 go tool 的脚手架,叫 Kratos Tool,把我们刚刚说的约定规范都通过这个工具一键初始化。 对于我们内部的工具集,我们大概会分为几块。第一块就是 API 的,就是你写一个 PB 文件,你可以基于这个 PB 文件生成 gRPC,HTTP 的框架代码,你也可以基于这个 PB 文件生成 swagger 的一些 JSON 文件或者是 Markdown 文件。当然了,我们还会生成一些 API,用于 debug 的 client 方便去调试,因为我们知道,gRPC 调试起来相对麻烦一些,你要去写代码。 还有一些工具是针对 project 的,一键生成整个应用的 layout,非常方便。我们还提了 model,就是方便 model 和 DTO,DTO 就是 API 里面定义的 message 的 struct 做 DeepCopy,这个也是一个工具。 对于 cache 的话,我们操作 memcache,操作 Redis 经常会要做什么逻辑?假如我们有一个 cache aside 场景,你读了一个 cache,cache miss 要回原 DB,你要把这个缓存回塞回去,甚至你可能这个回塞缓存想异步化,甚至是你要去读这个 DB 的时候要做归并回源(singleflight),我们把这些东西做成一些工具,让它整个回源到 DB 的逻辑更加简单,就是把这些场景描述出来,然后你通过工具可以一键生成这些代码,所以也是会比较方便。 我们再看最后一个,就是 test 的一些工具。我们会基于项目里面,比方说 dao 或者是 service 定义的 interface 去帮你写好 mock 的代码,我直接在里面填,只要填代码逻辑就行了,所以也会加速我们的生产。 上图是 Kratos 的一个 demo,基本就是支持了一些 command。这里就是一个 kratos new kratos-demo 的一个工程,-d YourPath 把它导到某一个路径去,--proto 顺便把 API 里面的 proto 代码也生成了,所以非常简单,一行就可以很快速启动一个 HTTP 或者 gRPC 服务。 我们知道,一个微服务的框架实际非常重,有很多初始化的方式等等,非常麻烦。所以说,你通过脚手架的方式就会非常方便,工具大于约定和文档这个这个理念就是这么来的。 Configuration 讲完工具以后,最后讲一下配置文件。我为什么单独提一下配置文件?实际它也是工程化的一部分。我们一个线上的业务服务包含三大块,第一,应用程序,第二,配置文件,第三,数据集。配置文件最容易导致线上出 bug,因为你改一行配置,整个行为可能跟 App 想要的行为完全不一样。而且我们的代码的开发交付需要经过哪些流程?需要 commit 代码,需要 review,需要单元测试,需要 CD,需要交付到线上,需要灰度,它的整个流程是非常长的。在一步步的环境里面,你的 bug 需要前置解决,越前置解决,成本越低。因为你的代码的开发流程是这么一个 pipeline,所以 bug 最终流到线上的概率很低,但是配置文件没有经过这么复杂的流程,可能大家发现线上有个问题,决定要改个线上配置,就去配置中心或者配置文件改,然后 push 上线,接着就问题了,这个其实很常见。 从 SRE 的角度来说,导致线上故障的主因就是来自配置变更,所以 SRE 很大的工作是控制变更管理,如果能把变更管理做好,实际上很多问题都不会出现。配置既然在整个应用里面这么重要,那在我们整个框架或者在 Go 的工程化实践里面,我们应该对配置文件做一些什么事情? 我觉得是几个。第一,我们的目标是什么?配置文件不应该太复杂,我见过很多框架,或者是业务的一些框架,它实际功能非常强大,但是它的配置文件超级多。我就发现有个习惯,只要有一个同事写错了这个配置,当我新起一个项目的时候,一定会有人把这个错误的配置拷贝到另外一个系统里面去。然后当发现这个应用出问题的时候,我们一般都会内部说一下,你看看其他同事有没有也配错的,实际这个配错概率非常高。因为你的配置选项越多,复杂性越高,它越容易出错。所以第一个要素就是说,尽量避免复杂的配置文件。配得越多,越容易出错。 第二,实际我们的配置方式也非常多,有些用 JSON,有些用 YAML,有些用 Properties,有些用 INI。那能不能收敛成通用的一种方式呢?无论它是用 Python 的脚本也好,或者是用 JSON 也好,你只要有一种唯一的约定,不需要太多样的配置方式,对我们的运维,对我们的 SRE 同时来说,他跨项目的变更成本会变低。 第三,一定要往简单化去努力。这句话其实包含了几个方面的含义。首先,我们很多配置它到底是必须的还是可选的,如果是可选,配置文件是不是就可以把它踢掉,甚至不要出现?我曾经有一次看到我们 Java 同事的配置 retry 有一个重试默认是零,内部重试是 80 次,直接把 Redis cluster 打故障了,为什么?其实这种事故很低级,所以简单化努力的另外一层含义是指,我们在框架层面,尤其是提供 SDK 或者是提供 framework 的这些同事尽量要做一些防御编程,让这种错配漏配也处于一个可控的范围,比方重试 80 次,你觉得哪个 SDK 会这么做?所以这个是我们要考虑的。但是还有一点要强调的是,我们对于业务开发的同事,我们的配置应该足够的简单,这个简单还包含,如果你的日志基本上都是写在这个目录,你就不要提供这个配置给他,反而不容易出错。但是对于我们内部的一些 infrastructure,它可能需要非常复杂的配置来优化,根据我的场景去做优化,所以它是两种场景,一种是业务场景,足够简单,一种是我要针对我的通用的 infrastructure 去做场景的优化,需要很复杂的配置,所以它是两种场景,所以我们要想清楚你的业务到底是哪一种形态。 还有一个问题就是我们配置文件一定要做好权限的变更和跟踪,因为我们知道上线出问题的时候,我们的第一想法不是查 bug,是先止损,止损先找最近有没有变更。如果发现有变更,一般是先回滚,回滚的时候,我们通常只回滚了应用程序,而忘记回滚了配置。每个公司可能内部的配置中心,或者是配置场景,或者跟我们的二进制的交付上线都不一样,那么这里的理念就是你的应用程序和配置文件一定是同一个版本,或者是某种意义上让他们产生一个版本的映射,比方说你的应用程序 1.0,你的配置文件 2.0,它们之间存在一个强绑定关系,我们在回滚的时候应该是一起回滚的。我们曾经也因为类似的一些不兼容的配置的变更,二进制程序上线,但配置文件忘记回滚,出现过事故,所以这个是要强调的。 另外,配置的变更也要经过 review,如果没问题,应该也是按照 App 发布一样,先灰度,再放量,再全量等等类似的一种方式去推,演进式的这种发布,我们也叫滚动发布,我觉得配置文件也是一样的思路。 加入阿里云钉钉群享福利:每周技术直播,定期群内有奖活动、大咖问答 原文链接
有只黑白猫 2020-01-09 17:29:54 0 浏览量 回答数 0

云产品推荐

上海奇点人才服务相关的云产品 小程序定制 上海微企信息技术相关的云产品 国内短信套餐包 ECS云服务器安全配置相关的云产品 开发者问答 阿里云建站 自然场景识别相关的云产品 万网 小程序开发制作 视频内容分析 视频集锦 代理记账服务 阿里云AIoT