一起来聊编程吧

8 hjs 3周前 288次点击

话说各位大佬或者新入坑的坛友们,觉得编程最难的部分是什么?没事,从你们的角度出发,无对错。

先说我自己吧,我就是属于那种在比较小的时候接触过这种东西的。已经过了三四年吧,现在我感觉最难的就是各种函数的调用,还有算法。这里的函数包括语言自带的一些功能函数,还有系统的api。现在语法对于我来说已经很简单了,其实学过一门语言,思维转变过来就会发现,语法这个东西就是一套规则,很短的时间就可以掌握,无非就是有的语法经常使用会记得更清晰,有的语法在长时间的没有使用的情况下会忘记。

现在对于我来说,改造代码,就是让一坨看上去非常臃肿的代码变得更清晰更少,这是一个比较难的问题。还有就是架构啊,架构我现在也不会,嘿嘿。像他们说的各种模型架构,什么乱七八糟的,都不会。然后接下来就是我说的算法,因为算法确实非常难,既有数学能力,还要有逻辑能力。算法这个东西,我个人觉得只能慢慢看,因为你看一遍是不会认识他的。算法的代码量其实并不多,像很多教材的排序算法,还有各种算法基本都他们看上去很短小,就是一个很短小的函数,或者是一个方法。而且他的每一行代码你都认识,但组合起来你就不知道。为什么要这么做呢?你会冒出各种各样的问题,并不限于。这么做内存会溢出吗?这么做数组的下标是怎么变化的?这么做,这个值是怎么变化的?然后再说一说api的问题,这个问题其实不是很难的问题,但收集api是很需要时间的。对于我一个性子急躁的人,翻文档找api非常的麻烦,所以我会询问ai,但懂得都懂ai的准确率有的时候有点低。

所以你们心目中,编程哪里最难?欢迎在评论区留言哈。

共 19 条评论
网络请求和响应这一块比较难。
0 

我是个小白,来学习的,感谢楼主分享自己的感悟。

hjs [楼主] 3周前
0 

没啥感悟,我也是小白,我只是顺嘴说说,如果有帮助最好不过了。

有些时候你发给服务器的是一个东西,服务器返回给你的又是另一个东西。甚至有些时候它返回给你的东西你都还看不懂。举个例子,当你在编写语音合成的时候,你需要向服务器发文本和参数,服务器会返回一段加密后的音频数据。有些时候直接是二进制流,有些时候被包装成了 Base64,需要你自己解码。如果直接是二进制,我们可以用 HTTPGet 直接拿字节流,或者使用 InputStream 创建一个输入流的对象,包含音频片段的字节数组,然后逐字节读取。但通常逐字节读取会比直接 HTTPGET 要慢很多,而且这个对象能放多少个数组,完全由缓存区决定。
hjs [楼主] 3周前
0 

你可以手动控制吧,在后端编写一个后端程序。如果你说的是公共的api,比如说讯飞或者第三方的语音合成的话,那他们不会出现这种情况,他们会统一返回的啊。但如果这是你自己的,你可以在后端写程序啊,让他返回指定的格式。加密解密都靠你自己来决定。

有些接口它不会直接返回音频二进制数组,所以不能直接 HTTPGet或者inputstream,需要先进行一次编解码,然后才能播放。最常见的需要编解码的情况是,服务端返回一个 Base64字符串,需要返回 AudioBuffer 或者返回解码后的二进制数组给播放器,然后再放到一个 InputStream 里面,或者直接 HTTPGet,这样才行。
还有一些接口,它不会给你返回一个音频片段或者 Base64字符串,它会给你返回一个经过 GZIP 压缩后的 对象,这个对象里包含二进制数组。然后你需要先通过 gzip 解压,然后才能够进行返回给播放器。
不不不,讯飞的接入比你想象的要难得多。首先在传输请求数据的时候,也就是传参的时候,我们需要把参数进行 AES 高级加密。我们都知道,在进行 AES 高级加密时,需要设置密钥,并且根据 AES 加密算法的规定,密钥最长不能超过16个字节,也就是不能超过16个半角字符。所以在进行 AES 高级加密的时候,只能够选择宽度小于二的字符,也就是半角字符进行设置。它并没有那么严格的规定必须得用16进制字符(0-9 a-f),而且还要处理服务器返回过来的数据
hjs [楼主] 3周前
0 

你用的是Java吗?或者是.net框架,但是不像后者,应该用的是Java对吧?

righnoJavaScript
框架用的是 Buffer,没有用 Java 点 NET,感觉这个解码库比 Java 点 NET 要高级很多。
hjs [楼主] 3周前
0 

我不太清楚你用的那套框架是怎么发请求的,如果是缓存区的话,那就只能放到缓存区里,然后你就读出来。如果不及时拿出的话,缓存区会被重新填满,如果不覆盖,只有一直往里写入的话,容易缓冲区溢出。

正常,我也是编程小白,就只会写点简单的 JS。
hjs [楼主] 3周前
0 

那你这样的话就只能根据情况处理了

hjs [楼主] 3周前
0 

可以把一些通用的动作封装一下,不通用的,比如处理不同格式的动作,单独用方法

与忘忧 3周前
0 

其实像那种那种怎么说呢,就是那种类似于正式版和公益版的这样的调度比较难。我就直接明说了吧,就是点名安卓,以它来举例,他不是有公益版,商业版,商业版也是正式版吧,还有串号版,其实都是一个app弄的,新人可以体验15天正式版。如果这时候我禁止他联网,我是不是可以卡十几二十几天的正式版呢,所以在这一方面,就是会员和普通用户之间这一方面,这个bug估计比较难,因为你需要在他那个安装包里面弄一些乱七八糟的东西,总之感觉就挺崩溃的吧,我也不知道该怎么说了。

hjs [楼主] 3周前
0 

这个,这个可能也真就没什么好办法。本地验证可以解决联网问题,但解决不了篡改问题。当然也可以解决,比如说在私有文件里面写一个体验的结束日期什么的,然后用哈希验证。每一次启动检查有没有体验资格的时候,就检查这个文件的哈希和正确的文件哈希是不是一个?如果是的话,这个文件基本是没有被修改过的。所以正确的文件哈希就需要加密再存储在别的地方。如果是我的话,我会加密。

与忘忧 3周前
0 

是的,让他在本地校验确实要好一点,毕竟手机里面,特别是原生安卓里面,都可以禁止单个应用联网。假如我要一直体验点名安卓的正式版,我禁止他联网就行了,但是呢,这样的话又有一个悖论出来了,你要校验那个文件里面的哈希。理论上来说可以,那万一这玩意儿是我的备用机呢,我每天都把时间改为体验正式版的那天,让他一直卡那不动,他一直拿到是错误的时间。这样时间对不上,和自家服务器又连不上,他不就直接原地隔离了。

hjs [楼主] 3周前
0 

当然吧,这个还是比较费劲,如果有懂技术的也能干掉,反正也许大概可能可以自定义一个配置文件,在配置文件里写别的二进制位,来辅助确保这个文件。

添加一条新评论

登录后可以发表评论 去登录