Fano_个人页

个人头像照片 Fano
个人头像照片 个人头像照片
7
3
0

个人介绍

一只普普通通的技术宅

擅长的技术

获得更多能力
通用技术能力:

暂时未有相关通用技术能力~

云产品技术能力:

阿里云技能认证

详细说明
暂无更多信息
  • 发表了文章 2022-03-04

    学习报告——冬季实战营第五期:轻松入门学习大数据

  • 发表了文章 2022-02-25

    学习报告——冬季实战营第四期:零基础容器技术实战

  • 发表了文章 2022-02-18

    学习报告——冬季实战营第三期:MySQL数据库进阶实战

  • 发表了文章 2022-01-28

    学习报告——冬季实战营第二期:Linux操作系统实战入门

  • 发表了文章 2022-01-24

    Ubuntu开启root账户登录的方法

  • 发表了文章 2022-01-24

    Ubuntu系统中几处常见的隐私处理

  • 发表了文章 2022-01-21

    学习报告——冬季实战营第一期:从零到一上手玩转云服务器

正在加载, 请稍后...
滑动查看更多
  • 回答了问题 2023-05-09

    Rust入驻Windows,重构是代码开发的必经之路?

    重构是否为代码开发工作中的必经之路?

    我觉得重构在代码开发工作中应该算作一个必经之路,而且是要定期去做的一件事。在一个软件的生命周期中,可能重构不只需要进行一次,甚至要进行许多次。

    代码重构本身是为了修补漏洞、提高性能、修整代码结构、增加代码的可读性。我个人以为,下面这几种情况应当算作是代码重构能发挥重要作用的场合。

    1、开发者在开发一款软件时,并未对代码方面的知识有足够的了解,比如一些常见的设计模式、同类型业务的常见解决方案和代码编写风格等,从而导致自己的代码逻辑性不强,结构混乱,做出来的东西仅仅是能用而已,运行起来没有错误,但是设计上极其不合理。随着接触和掌握到的知识变多,开发者认识到了自身的不足,决定对自己的作品进行修理,这个时候重构无疑是开发者提升自己的良好的实践手段,推翻自己的代码,重写所有的功能,我觉得这样进行重构之后,不仅程序本身会受到提升,开发者自身也会获得精神上的成就感和满足感。尤其推荐学生朋友们进行这样的重构,比如老师上课留的作业,要做一个东西,完全可以自己重构很多次,尽量保证一次比一次更好。

    2、公司的产品,尤其是经历了很长时间的产品,若干新老员工共同编写了若干年的一个产品。老代码不敢动,只能不断写出冗余的代码,导致不必要的运行效率低下和结构臃肿。我曾经见过一个产品的一个代码文件中结构安排不合理,同一个代码文件中写了几千个if-else。这时候就特别需要从头开始做一次重构,把结构重新设计得合理一些,把冗余的代码进行剔除,把对应的功能进行完善和修补。

    3、关于算法。不能保证每一个程序开发人员都具有非常扎实的数据结构和算法功底。大家的水平参差不齐,写出来的算法效率也不一样。底层的算法,以什么样的方式进行处理,和前端如何沟通,如何传输数据,要传几次,如何安排数据的结构,如何进行加密,这些都或多或少涉及算法和数据结构。再比如单纯的处理文件的算法,如何进行高效处理,如何优化运行时间,这些都需要深入学习和多加练习才能有对应的条件反射。所以可想而知,有些零点几秒就能跑完的算法,换另一个人来写,可能要跑几秒。而一个业务流程里,可能会有多个算法,相差的时间加起来,不是一个小数量。所以这个时候做代码重构,其实是在做算法和效率的重构,减少用户的等待时间,降低服务器的资源损耗。

    4、就如这次问答的题目中所说的一样,微软使用Rust进行核心库的重构。这就是语言导致的重构。不断有新语言横空出世,新语言比原有的语言安全性高,执行效率高,或者可以和新时代的硬件结合得更紧密,那用新的语言重新写原有的功能,也会使其在执行效率和安全性的层面变得更好更优秀。

    接下来说到本次讨论的第三个问题——如何写出干净优雅可维护的代码?

    干净是怎么个干净法?

    1、合理规范的命名非常重要。这里的命名,既包括代码文件的命名,也包括代码文件中各种类和变量的命名。好的命名,可以让开发者了解代码文件概要,了解各个方法所实现的功能,了解每一个变量中保存的是什么内容。初学者写代码最喜欢把变量用abc这样的名称去命名。我建议大家可以去网上寻找一些大企业的内部代码规范,看一看真正的业务线上一般是如何要求的,从初学的时候就开始养成良好的习惯。

    2、正确的代码缩进必不可少。现在很多IDE都自带自动代码缩进的功能,这点倒不用特别担心。代码缩进有很多种风格。如果是跟着项目组一起做一个大项目,那最好大家商议一下,使用同一个代码缩进风格。最后合并代码的时候,保持一样的风格会使代码非常干净整洁。

    优雅来自哪里?

    1、正确的结构设计和逻辑设计。这点一般就要多看一些设计模式相关的内容了,好的设计模式可以给程序带来良好的架构。而且好的设计模式会使项目中的代码拆分变得条理清晰。

    2、减少冗余代码,增加代码复用。不知道大家有没有遇到这种情况,明明是同一个功能,可是由于沟通方面出现了问题,导致前面有人写过的方法,后来接手项目的同学又写了一遍,而且功能大差不差。或者是设计本身有问题,导致某个方法变成了单文件内专用。明明只是一个参数的问题,写一个方法大家都能用,结果被写死成固定的方法,没有提炼出来成一个可复用的方法。这样的冗余实在是太可惜了。增加代码复用率以后,程序本身就可以变得优雅不少。

    如何使自己的代码可维护,或者方便维护?

    1、又说回命名的问题了。想让代码方便维护,首先要容易读懂。代码易读性不好,变量名字文件名字方法名字乱七八糟,拿到了看半天都一头雾水,这样的代码,就不要指望去维护,更别提拿来重构了。

    2、高内聚、低耦合。尽量保证一个类中的每个成员方法只做一件事,保证最大限度的聚合。而且尽量不要让一个类内部的成员方法互相调用,这样以后做功能变更修改代码时,报错的概率会大大降低。少使用全局变量,也尽量不要用硬编码的方式去写代码。而且尽可能保证在删除其中一个模块的代码的时候,只影响依赖它的模块,不要影响到项目中和这个模块没有关系的地方。

    3、与时俱进。这里的与时俱进,是说能用新的语言版本新的库版本,就尽可能在保证稳定的情况下用新的。代码越老,一些依赖的库就越不容易在新机器上得到兼容。毕竟兼容也是有限制的,随着操作系统和硬件的不断发展,已经有很多老旧的源码需要经过大量的修改才能通过新环境下的编译。而若干年后的人,看现在的人写的代码,也会发生同样的事情。让代码和时代的差距小一些,之后维护的时候应当也会方便一些。

    再次来参加开发者社区的话题讨论,以上是个人的一些拙见。希望在这个开发者大家庭中,和大家互相学习,共同进步。祝开发者社区越办越好。

    踩0 评论0
  • 回答了问题 2023-05-06

    有没有一种可能,其实你早就在AIGC了?

    其实AIGC已经很早就进入了人们的生活。可能很多人都没有察觉。而提及Serverless和AIGC的结合,我认为也要让它回归到生活中的各种实际应用。

    除了生成式图片创作,还有很多地方可以进行应用:

    -路上的车辆抓拍,使用基于人工智能的物体识别技术。

    -停车场入口处的车牌识别机器,使用了基于人工智能的车牌识别算法。

    -私家车的自动驾驶,使用了基于人工智能的寻路系统。

    -杭州的城市大脑,也使用了人工智能配合大数据减少了交通拥堵。

    -上班打卡用到的人脸识别考勤,也用到了部分人工智能技术。

    -医学上使用眼底图来发现眼部疾病,用到了基于人工智能的特征识别技术。

    -平时使用的各种美颜拍照APP,也都一定程度上用到了人工智能的算法,美颜、磨皮、自动抠图,等等。

    -路政的路面情况检测,使用到了人工智能技术来检测柏油马路是否出现了裂纹。

    -最近的ChatGPT和其他的类似应用,也使用了人工智能技术。

    -图片超分辨率的应用,也使用到了人工智能技术,通过大量的训练,取得了很不错的效果。

    -绘画和色彩方面的应用,比如线稿自动上色、黑白照片自动上色、给定关键词自动绘画,都用到了人工智能。

    -汽车驾驶员的疲劳驾驶自动报警,用到了特征识别技术。

    -手写字体识别,各种OCR程序、声音识别程序、语音转文字、也都有人工智能的身影。

    大致先举出以上这么多例子。这些都可以是Serverless和AIGC相结合的领域。其实说到底,每一个应用到人工智能的地方,本身就是在进行AIGC。

    虽然人工智能听起来很厉害,现在也确实产生了很多很厉害的成就,可是它并不是完美的。

    首先,人工智能靠大量的数据进行训练,只是在样本尽可能丰富的情况下尽可能对现实中的情况做出拟合。样本库内样本情况丰富度以及样本数量的多少,都会影响最后的人工智能程序的水平。它本身其实并不会辨认,能做出辨认也只是因为见到过、学习过的缘故。所以人类本身并不能期盼一个人工智能应用在各种时候都在它自己要做的事上产生出百分之百正确的结果。

    现在的文字识别和语音输入,都很明显地存在这个问题。每个人的手写都不一样,即便是打印体也千奇百怪。这导致了一个识别率低下的问题。语音识别方面,五湖四海口音也不同,所以也很难去囊括所有的口音。

    其次,样本的质量要求很高,样本中有一部分出问题,可能就会对全局产生难以修复的后果。举个例子来讲,人工智能用在绘画方面,最近最火的当属人工智能出图了。像ArtStation这种大站上也出现了不少人工智能产出的图。可是之前突然有一段时间人工智能产出的图都出问题了,被打上了莫名其妙的花纹,原因是艺术家们的图被拿来当特征训练样本进行使用,很多艺术家为了自己的图片不被盗用,就上传了很多标着禁止图案的图片,污染了对方的样本库。于是这样就可以轻松毁掉一个AI。这个现象从某种程度上体现了人工智能的漏洞,体现了训练样本的重要性。

    样本的丰富度同样极其重要。还是用人工智能绘画举例子。从有这种应用到现在,也已经很久了,但是AI出的图有一个弊病从未改变——AI不会画手。之前看到了很多例子,服装背景人脸都很优秀,甚至头发也很优秀,可是手部一塌糊涂。这就是样本不够丰富造成的。

    回到本次讨论的第三个话题,我觉得Serverless和AIGC领域想要融合得更加紧密,做好个性化的AI体验是非常重要的。Serverless之所以会应运而生,也是因为需求。而AIGC则是把个人的需求或者企业的需求个性化、具体化,以一种高效拟合、失误率极低的生产方式进行内容产出。不可能人人都理解Serverless的实现,也不可能所有人都理解AI的底层逻辑,这样一来,降低使用门槛就非常重要了。

    如何才能降低这个组合的使用门槛呢?我觉得首先要做低代码,把低代码做好,图形化做好。这个方面可以参照Orange那个程序,使用起来很方便。设想中最坏的情况是,公司会让完全不懂程序的人去做AI内容产出。所以尽量从训练步骤再向上一层,直接给出方便调用的功能。

    Serverless主打一个函数即服务的理念,那么在AI的常用领域,不妨多做一些方便进行调用的函数库,既可以完善功能,又可以精简代码,而图形化又可以进一步精简这个过程。也就是说利用图形化操作界面生成Serverless代码,然后直接打包放到云上运行。这样应该说是最友好的方案了,毕竟要考虑到使用人群的技术力,以及阿里云平台这方面业务的后续推广。

    一时兴起写了这么多,希望能抛砖引玉。以上仅为个人拙见,让各位看官见笑了。祝阿里云越来越好,开发者社区越办越红火。

    踩0 评论0
  • 回答了问题 2023-04-07

    聊聊你和Java的故事

    上大学的时候,我的课程里有Java课,Java也是我接触的第一门面向对象的编程语言。

    最开始学C的时候,对面向对象根本就没有概念,开始学习Java课程之后,接触到了面向对象的各种概念和理论,就越来越觉得面向对象真的不错,抓住事物的特点就可以减少很多冗余代码,也符合人对事物正常的理解。

    我对Java的并发了解得不是很多,就主要说说第一个点——问题排查

    我认为,对一个经常写代码的爱好者,或者是以编写代码作为职业的专业软件从业者来讲,对编程语言本身问题的排查,应该是最基础也是最重要的。

    1、先要学好英文。或者至少要掌握常见的IT相关英语词汇

    很多时候,报错的提示或者IDE本身的log都是纯英文的。我见过很多例子,人家错误提示给得很明白,但是当事人就是读不懂,还跑到一些开发群里去问,这个怎么怎么改,那个怎么怎么改,然后下次遇到了又不会了,真的是换一个单词就不认识了的程度。所以掌握很多IT英文术语真的非常重要。最起码能看懂自带的一些错误说明。

    2、学会自己看报错提示

    编译卡住了或者运行卡住了报个Error,一般在对应的信息框里或多或少都会有那种一般是红色的提示,顺着红色的字去追根溯源,一般都会找到问题的源头,是标点符号写错了还是什么地方给错了参数之类的,一般都会有明确的提示。

    3、一定要使用一个成熟的IDE

    可能初学者朋友会遇到这样的情况:你的老师推荐你使用EditPlus或者别的一些可以自己添加工具以及添加命令的简单编辑器,说是要锻炼你使用工具的水平。这其实是个误区,非常大的误区。这并不会给你的编程效率带来任何的提高。而且简单编辑器并没有IDE中一些例如自动补全的便捷功能。IDE之所以受人欢迎,很大的一个原因是它们能让人专注于业务的实现,而不是如何避免写错字母和写错单词以及少写大括号。编程这个东西,理论还是要远远重于语言本身的。比起如何敲字,更应该学的是怎么实现语言的应用,以及为什么这么实现。用一用IDEA或者Eclipse,比这些小编辑工具好太多了。而且IDE的自动分析功能可以帮助你省去很多无用的排错时间。

    4、务必学会使用单步调试

    这放在任何语言中其实都很重要。打若干个断点,用debug模式运行程序,查看对应的变量,内存中的数据改变。大家可能都有过这种情况,看着代码从头看到尾,惯性思维让你觉得这一大段代码自己写得都对,看着都很不错,但是每次运行都得不到正确的结果。于是反复浏览代码,反复怀疑人生。其实单步调试之后发现,可能问题就是出在一个小的循环上,或者其中一个小的字符串处理过程上。一点小问题淹没在大量的代码中,很难发现。直接打断点调试,在某一行之前没出错,但是超过这一行就出错了,就可以很方便定位到错误的源头,改起来也很快了。

    5、善用网络资源

    我的C语言老师在教我改bug的时候,特意着重强调了这点,他说:“你们肯定不是第一个遇到这个问题的人”。就是说任何语言问题,只要遇到了,都可以上网去查,先把报错内容输入到国内外各大搜索引擎去试试,无论是环境配置还是运行报错,搞不明白的都可以这样去做。专业一点的地方像MSDN或者stackoverflow,都可以去找找。只要不是东西过于新,终归是能找到的。

    以上写的这些,就权当是给初学者朋友们指指路吧,其中也有一点自己踩过的坑,大家不要再踩了。其实无论是Java也好,C也好,Python也好,这些语言都是工具,不是写程序的瓶颈。不同的人用同一种语言,写一样的功能,出来的代码也是不尽相同的。

    我报名了李三红老师开设的“ Java大师课”,正在好好学习中。这个课程让我拓宽了知识面,了解到了很多平时没有接触过的东西。尤其是第5课时“问题排查:你需要掌握哪些分析方法学”,让我觉得十分精彩,这节中介绍的理论知识用在其他语言上也应该是可以的,建议大家都来学习一下,真的很棒。

    踩0 评论2
正在加载, 请稍后...
滑动查看更多
正在加载, 请稍后...
暂无更多信息