记一次比赛开发心得

应用开发的理解及效率的提升?换语言如何开发?

前言

最近结束了一个比赛的项目开发,做的是人工智能与图像识别相关的。本来是不打算参加的也是受人委托,当时拿到需求确实觉得简单,但是落实起来还是以遇到了许多困难。加上很久没有写大项目了也有些生疏了…虽然最后也完成了任务,但总觉得不够完美,当然此次开发确实是让我跳出了我自己的舒适圈,本来是打算上我最拿手的java,由于某些原因我不得不使用Python来开发后端,开发的过程完全是从0摸索,真的想吐槽一下Python,报错后的错误真的很难定位到…为什么包之间不向下兼容啊。技术实现还是大同小异,本篇博客不会着重描述,只是单纯记录开发历程和一些新get到的方法。我觉得还是蛮有意义的写这样一篇技术性随笔….
图像识别
视频识别

为什么选择Python

起初项目孵化的时候,一些简单的crud我套用的是之前一个老SpringBoot的项目,后来由于项目使用了YoloV8,看了其相关文档,毕竟是Python环境下的项目,用Python直接提供了其调用Demo,如果使用java我查阅到的资料可能最后还是会回到在java中调用Python这种套娃情况。又或者写一个图像识别的Python服务然后采用Java在进程级别进行通信,可是这样的实施成本又太高了,权衡之下最终选择了直接上Python,因为之前老早就想试试Python的fastapi。
刚上手的时候确实我非常惊讶于fastapi的项目配置和启动,在以往的JavaWeb开发中光是配一个Tomcat我都弄了好久,加上入门时我还要为一个一个的Servlet配配置文件以及重写方法,当时学的时候就觉得这些好麻烦,而fastapi给我的体验就是一种打开了新世界大门的写法,一行挂载一行注释一个函数一个路由就写好了,这也太便捷了,这简直让web开发的成本一下降低了好几个档次。
如果你对fastapi感谢趣不妨去看看他的官方文档,你就会惊叹其便捷之处了!

简单带来的问题

上手快的确带来了一时爽,在开发过程中健壮性、易维护性的问题却会逐渐的暴露出来,当然这里仅是一位初级Python web开发者的拙见。在运行时的报错虽然能够利用Pydanic来抑制错误信息的暴露,但在开发过程中错误的定位让我非常难受,有时候一个错误很细节但他的报错却深入到源码底层,不是特别熟悉的玩家还真是头大,其次就是一些包他实现的功能可能和你预期的不太一样,需要细细甄别,然后就是环境问题了,也许就是一个不同的版本的包造成的结果会是一堆爆红,如果你不是老手还真是很难发现其中的奥秘……总而言之我还是非常欣赏这种web开发框架的设计方式,规范问题需要的是程序员自己积累,开发一些小型后台api确实省时省力。

协程函数

这是自上次面试背八股在实际开发遇到的有关协程的问题。其实早在JavaScript 就有打过交道的await 和 async。协程不同于线程和进程,他是由程序员自己创建出来的帮我们提高代码IO阻塞代码效率的一种调度方式,当然这样说还是有点牵强的,但是有一点是必须的那就是协程一定是在线程之上的,一个线程的阻塞不会让协程也停止调度,异步IO将会挂起切换到其他协程,是一种分时复用的思想,听起来好像和多线程差不多,但是其实协程的切换是在用户态,他也不需要额外的内存空间,效率非常高。什么是协程?

进程 线程(特指内核态线程) 协程
切换者 操作系统 操作系统 用户
切换时机 根据操作系统自己的切换策略,用户不感知 根据操作系统自己的切换策略,用户不感知 用户觉定
切换内容 页全局目录、内核栈、硬件上下文 内核栈、硬件上下文 硬件上下文
切换内容的保存 保存于内核栈中 保存于内核栈中 (用户栈/堆)
切换过程 用户态-内核态-用户态 用户态-内核态-用户态 用户态

浅析Python中异步和同步函数

工程化的项目

软件开发的一个重要目标就是要容易维护,无论是前端还是后端严格的分层次带来的长期收益是巨大的,例如前端我以前经常会把一个页面的组件、逻辑、数据写到一个文件里,一旦逻辑复杂一点,整个项目就会显得非常臃肿.这次我几乎大改了新版的ant design pro,踩了好多坑也自己实现了许多之前他自带的很多全局方法。最重要的还是组件化的思想,组件可以独立的拆分你的UI视图,他们是可以复用的,独立的单元。和函数类似,React中组件接收的输入源称为props,并且返回react元素。react元素是对UI界面的描述。你可以告诉react你期望的UI界面,剩下的工作可以交给react来处理。我们拿乘坐计程车打比方,当你告诉司机你想要去的地方,司机就会按照你期望地点将你安全的送到目的地。而不用你自己亲自开车。
在FastApi 我依旧沿用了MVC 的开发模式,当然这里V由react代替了,只不过Python好像大部分也是在写函数式的M和C.
函数式编程(Functional Programming)是一种编程方式,它将计算机运算视为数学函数的计算,并且避免了状态变量和可变数据。函数式编程强调函数的纯粹性,即一个函数的返回结果只由输入决定,不受外部环境影响。 这里要区别于面向过程和面向过程的编程,他们强调的点不一样,在此就不详细讨论了,后续会有专门的文章来讲讲其中的差异.

人工智能将取代程序员?

说实话此次开发,chatgpt帮了我很多忙,我甚至让他帮我写了很多组件和工具函数,其中不乏一些核心的yolov8结合opencv的视频视频逻辑,其准确率异常的高,不得不说现在的人工智能的出现对一些行业是会出现一定的冲击。但是他依旧会存在一些问题如果你的需求不够具体,这就像产品经理像程序员提需求一样,不说个清楚,写出来又不满意哈哈◑﹏◐
但是要是说人工智能会取代我们程序员还是有待商榷,因为在一个项目中,其业务逻辑还是很复杂的,很有可能不同模块是不同人开发的,你让他完整的写一个程序他考虑的东西还是太少了,你让他写一部分程序,他又不能严格按照我们的代码风格为我们服务,总之用它写一些不需要多模块联动交互的逻辑工具方法还是挺方便的,能够极大提高效率,完全依赖于它也许不是一个很好的办法。我们还是动动脑子的…

chatgpt帮我写代码


记一次比赛开发心得
https://yilinyo.github.io/2023/05/01/记一次比赛开发心得/
作者
yilin
发布于
2023年5月1日
许可协议