2020-12-07

18 篇热帖

1. 公司后端技术选型-是选择 go 还是 Java ?

我们公司是主要是开眼科诊所,但是需要把我们公司的日常业务搞成信息化、数字化管理。之前业务紧就选用 python 来开发后台应用,但是有时候 python 处理业务逻辑什么的特别慢,而且非常耗服务器 cpu 资源,现在就感觉 python 遇到瓶颈啦,假如说以后我们公司的诊所越开越多,业务也越来越庞大,要是从后端技术中选一门语言来支撑我们的哦业务发展,你们觉得是选择 go 还是 java 。我们公司有一些互联网的项目 公众号、小程序、挂号-做检查-收费-开药一系列操作的医疗系统。

3. aws 免费服务器被扣 300 多元流量费怎么办?这个月又已经有 20 美元未结算账单了

只是用于自己做代理使用,平时每个月 15G 的免费流量都用不完,也没开放其他对外服务。
这几个月也一直很少使用,没下载过东西,只非常偶尔访问下 youtube,正常根本连免费流量都用不完

aws.png

5. 我喜欢保存 Linux 图片,有点疯狂
我经常在 reddit/r/unixporn 看 linux 图片,遇到喜欢的就保存
后来我在 discord 看 linux 图片,也喜欢保存
Twitter 上关注了 unixporn,还是 reddit 上的 link
telegram 上订阅了 unixporn,还是 reddit 上的 link
直到现在我保存了有 3000 多张图片,用坚果云同步,也保存到百度网盘里
太喜欢 linux 了,恋恋不舍,我还将继续保存 linux 图片,哈哈哈
这也算是我的爱好吧
6. 2020 年快过去了,你们的股票(基金)收益怎么样了?
7. 没人讨论一下 m1 用 crossover 么😂目前装了几个 windows 应用都比较完美,舍友试了一下巫师 3 竟然不卡

原本就是装个 dev c++ 模拟一下考试环境,结果确实是有点不太真实

crossover 本身并不是 native 的 需要用 Rosetta 2, 然后又模拟了一个 windows 环境(?不太懂)

然后就可以打游戏了😂 u1s1 确实不卡

8. 关于买新 iPhone ,非常纠结😫
本来今年发布的 iPhone 让我购买欲空前强烈,但是正当我要下单的时候,网上已经到处充满了 iPhone 绿屏事件,Apple 官方那边也一直没有一个负责的回应,只是说会通过系统 OTA 更新来解决问题,但是这个问题更大的可能性并不是软件问题(华为 Mate 20 就是先例),我从第一部 iPhone4 开始就是一直买港版,已经变成习惯,这也是我纠结的关键所在:代购的港版应该是不会因为绿屏问题而再去换新机,现在买港版可以算是抽奖了吧,我没有拼运气的自信……
现在想买港版新 iPhone,又怕买到绿屏……纠结好难受,不知道该怎么办。

PS:之前也看到 V2 上有人是:“手机不就是个工具嘛,绿屏又不是不能用,何必那么矫情”类似这样的观点,我想说我买手机的钱是我自己挣的辛苦钱,我花我挣的辛苦钱买的东西,我有权要求它是质量合格的商品。持这种观点的朋友就别在下边留言了,浪费你的铜币,破坏他人的心情。
9. 小团队 适合用 k8s +Spring cloud +微服务吗
目前公司技术基础比较羸弱
外面给的方案是这一套
但我个人认为这只是谈架构的东西
如果用户不到一定规模似乎,没有必要
10. 有没有程序员去外国工作的途径呢? 咨询下各位大佬
目前在二流厂工作也快三年了。
对工作 /环境已经腻了。何况国内这环境大家也有目共睹
趁着现在年纪不大 还没成家
打算明年过了年出去闯闯
有没有老哥们出来传授下经验?或者渠道?
个人期望是离家近的日本 以及没接触过的新加坡
11. 征名-准备做个环游世界的旅行工具网站,还没有想什么名字

准备做一个网站,以世界各地景点为对象进行数据分析评分,以及根据景点关联攻略、酒店等资源,并提供点评、社区功能,目标是成为环游世界的旅行规划工具。现在还没有想好名字,各位帮出个?

12. 有没有人和我一样,从来不用 App Store 下载软件?
我的原则就是,网页能下载的,绝对不到 app store 下载,原因就是网页下载的更新速度远远比 app store 快,比如 office 365,甚至还可以体验预览版。第二个原因就是功能更强大,因为 app store 有沙盒机制,软件都有限制。

用 mac 很多年了,这一个原则从来没变过
13. 选择 M1 芯片的 Mac 还是 Windows 电脑?超级纠结中~

以前用过 3 年 MacBook Air,总体感觉是做工、材质、设计感超牛批,但匪夷所思的小毛病一大堆,比如 office 超级卡顿、开机后屏幕颜色突然明显的泛白、冬天在暖气房里依然开不了机、充电器还莫名其妙坏了一次等等~

后来受不了了换成了 Windows 电脑,虽然系统用着蛮顺手、也没什么功能上的 bug (因为我不乱捣鼓电脑,只是用它打打字,上上网,追追剧),但至今还没有让我觉得在设计、材质和用料方面可以媲美 Mac 的 PC 电脑(特别是台式机整机,估计是因为市场做不大的关系)。

现在 M1 芯片的 Mac 出来了,最纠结的地方在于,既想要回归苹果生态圈,感受高级的设计感和材质,但又害怕小毛病依旧不断。各路大神有没有好的建议,或者使用感受可以分享一下?

14. 迫于 N 年不开车上路了,问下有啥快速上手的技巧

找陪练太贵了,仗着曾经也开过( N 年前了),应该只需要回忆一下关键知识点就可以上路了吧。
比如起步时:踩离合->挂 1 挡->松手刹->边放离合边踩油门。

这个是我在网上找的,当时学的也忘了,记忆中好像不是边放离合边踩油门来着,特来求证下。

记忆中特别深的映像是变道前打转向灯(因为这个当时科三挂了 1 次,所幸第二次过了)。
还有操作盘上各种按钮的功能等(车子是 N 北京现代),那么所有的 N 都是通用的操作习惯吗?有没有网上模拟的操作盘供参考下。

先谢过各位!!!

15. 有什么事情年轻时不做,老了会后悔?
突然发现,年轻这个词可能并不会伴随我太久。趁着现在有时间有条件正好又是单身,想把一些年轻时才能做的事去体验了
16. 这人也太恶毒了吧,仅供用人部门参考....

17. 2020 的尾巴,大家觉得自己今年做过最有成就感的事情是什么?

2020 的尾巴,大家觉得自己今年做过最有成就感的事情是什么?

以及,觉得最后悔 /最可惜的事情是什么?

各列举 1-3 项吧。

成就感

  1. 加薪、储蓄达到今年的目标值,离财务安全更近一步了;
  2. 换了新环境,有了一个更大的平台,比过去两年每年的成长都要快多一点;
  3. 今年意外的有每个月 1-2 本书的阅读,而且其中读到是好书的比例蛮高的;

最后悔 /最可惜

  1. 运动变少了,胖的比之前都快,体重可能是历史最重的吧。目前还没有找到一个能控制体重的平衡点;
  2. 在人际关系上投入的时间变少了,今年更多的时间都是远离人群和朋友,独夫之心,日益骄固;

但总而言,2020 对我是好的一年,让我有了很多改变和成长,以及很多不一样的经历体验。

18. 阿里的大哥,可以帮小弟内推一下吗?

能不能留一下宝贵的建议或指导或者内推一下,现在帖中不方便放个人的简历。希望您能留下邮箱或者微信,我把简历发给您。我在这先简单介绍一下自己。

某高考大省一本计算机软件,工作三年以上。目前在杭州一家公司工作 3 年整,主要从事 Java 开发,现在是所在公司技术核心(技术 leader 加主程)。 领导信任,同事融洽,工作轻松。但是去阿里一直是自己的目标,外加以此做出的准备和付出的努力,以及考虑到的未来发展。

我的最大优点就是觉悟高(只有努力一条路可走),外加行动力还行。毕业以来每天都学习 1-2 小时,几乎没怎么间断。从本公司的代码看起, 直到完全理解架构、业务、实现,再到读技术书籍各大网站技术博客,再到深入 Java 核心 API 的源码。公司就这百万用户,年流水不过亿,任我这么折腾,但是平台就这么大。 虽然一个大企业技术不是一个人,但是这就经验和平台。我深刻认识到这一点,经验和眼界不足,我就疯狂研究源码,从 JCF 、JUC 到 Spring 全家桶、Mybatis 、再到 Netty 。

感慨 Java 程序员要学的太多,不说计算机、后端等相关知识,就是 Java 相关知识都特别庞大。记忆力不强只能一遍又一遍硬学,JUC 都学了十几遍,不过每次都有不同的收获也算值得。

但是自己三年多没面试过,虽然工作不重,但还是有工作要做,不知道要准备成什么样子,该刷面试题,还是要仔细复习一遍,还是先去其他公司面一下。

期望

现在第一志愿就是杭州阿里,期望职位是阿里云、天猫、菜鸟的 Java 开发,给自己的定位是 P6 或 P6+。我知道人生七分天注定,但是也要把剩下的做好,把在自己身上出纰漏的概率降到最低。毕竟这是我的自荐,可能有些夸大的成分,如果有冒犯到大家,请不要生气。

技能

  • Java 基础扎实,熟悉 Java 规范,仔细读过 Java 8 的语言规范和 JVM 规范。
  • 深入理解集合框架和 JUC 原理及源码实现,熟练掌握并发编程。
  • 熟悉 IO,熟练使用 Netty,熟悉 Netty 线程模型和线程池源码实现。
  • 熟悉 Spring 、Spring MVC 、Spring Boot 、Mybatis,并对其核心原理和源码有一定了解。

源码的学习和心得

重要的类仔细研究源码实现,比如 ThreadPoolExecutor 、ForkJoinPool 、AQS,特别重要的类一行一行研究源码,力保每行代码都知道是什么意思,为什么要这样设计,比如 ArrayList,ConcurrentHashMap 。但是认知有局限性,所以可能出现一些偏差,如果愿意指正,感激不尽。

  • ClassLoader,Java 8 只有 BootstrapClassLoader ( BCL )特殊,只有 BCL 有权力加载 java.包下的类,但是有非标准参数-Xbootclasspath/p 可以使自定义类取代 Java 核心 API, 比如 HashMap 之类。虽然 Java 层面无法获得 BCL 的引用,但是 Unsafe 的 defineClass 可以在 JVM 启动以后,也能让 BCL 加载自定义类,比如 java.test.JavaTest,但是无法替换核心 API 。ClassLoader 在 Java 11 (其实 Java 9 )发生了重大变化,-Xbootclasspath/p 被删除,核心 API 更加安全,ExtClassLoader 被删除,新增 PlatformClassLoader ( PCL ),当然不是换名这么简单。PCL 也有权力加载 java.包下的类,比如 module java.sql 就是其加载的。所谓的双亲委派模型也被抛弃了,现在 ClassLoader 加载的是 module 下的类,所以现在是先搜索类是否在当前 ClassLoader 加载的 module 下,然后交给父辈加载器,最后找不到会调用 SystemClassLoader 尝试加载 classpath 下的类(兼容 Java 9 之前的代码)。Tomcat 、Spring Boot 的类加载也不算复杂,Tomcat 广为流传的三个 common 、server 、shared 加载器其实都是 URLClassLoader 的实例,而且 7 及以后的版本这三个合而为一,只剩下 common 加载 lib,而内嵌情况下只有 WebappClassLoader 。Spring Boot 则扩展了 URLClassLoader 以支持 FatJar(jar in jar)。

  • 类卸载条件苛刻的多,Java 规范规定 BCL 加载的类不能被卸载,而 Class 和加载其的 ClassLoader 实例又相互持有,所以绝大多数 Class 不会被卸载,包括动态代理生成的。但是 defineAnonymousClass ( lambda 原理)生成的类不会被其 ClassLoader 实例记录,还有反射创建的 Method 对象,调用一定次数会生成 Class,但是其 ClassLoader 实例只加载这一个类,所以这几种情况类被卸载还是不难的。

  • ThreadLocal,ThreadLocal 只是一个 Key,起作用的是 ThreadLocalMap,其三种节点 null 、key=null 、正常节点,其中 run ( between two null slots ),每次 get/remove 如果在查找元素的时候发现 key=null 节点,则清理并 rehash 从定位到 runEnd 的所有节点,而 set 查找位置的过程中遇到 key=null 节点则会清理整个 run 。而扩容则是达到 2/3 阈值之后清理整个数组,如果清理过后元素数量还大于容量的一半则扩容。针对如此复杂并且低效的 ThreadLocal,Netty 提供了 FastThreadLocal 取代之,底层使用数组加索引直接访问,用空间换时间,自下而上的改造让 FastThreadLocal 不会出现内存泄露。

  • ConcurrentHashMap ( CHM ),CHM 在 Java 8 中直接重写,现在几乎是个并行 Map,是 JUC 最重要的类,原理简单,设计巧妙。理解 CHM 的 bin 意义、计数、扩容、遍历就能大致能弄清楚它。CHM 计数基本上照搬了 LongAdder,CHM 的 size 能超过 threshold 吗?能超过 capacity 吗? addCount(long x, int check)的 check 如何理解,为什么要加 mappingCount()取代 size()呢。CHM 怎么保证在扩容过程中遍历的呢。CHM 最有技巧的是并发扩容,此时 sizeCtl 高 16 是数组长度的标识,低 16 位代表扩容线程+1,通过数组分段实现并发(并行)扩容,不可谓不巧妙。但是 Java 8 扩容的时候是有 bug,这个直到 12 才修复。而且在扩容的过程中,有两点我不敢苟同,1.对单核处理器(逻辑)只有一个线程完成扩容,2.这个更重要,所有数据迁移完毕后,留一个线程 recheck,在这个线程没有 commit 之前,所有写线程都会自旋,recheck 时间依赖数组大小。线程的运行时间由 OS 调度,OS 不可能让一个线程一直运行,所以在两种情况下,效率不高,也会造成很大的 CPU 时间浪费。

  • AQS,虽然现在 AQS 及其子类已经不算特别重要了,但是其设计思想还是值得学习的。AQS head 节点代表的意义是什么,为什么从 tail 向 head 查找,独占模式和共享模式除了 Condition 只能在独占模式使用外真正的区别到底是什么呢,是独占模式只能有一个线程获取同步状态吗,那能不能用独占模式写一个 Semaphore 呢。带着疑问学习 AQS,理解也会更加深刻。

  • ThreadPoolExecutor 、ForkJoinPool 、Netty EventExecutor/EventLoop,ThreadPoolExecutor 基于 BlockingQueue,正所谓成也萧何败也萧何,BlockingQueue 基于 AQS,而 AQS 实现的独占锁现在性能和 sychornized 差了不止一个数量级,不仅如此,底层共享一个 BlockingQueue,造成效率低下。ForkJoinPool 是个先进的线程池,不仅每个线程都有自己的工作队列,还能在空闲时窃取其他的任务,已到达负载均衡,它是 JDK 中最重要的并持续维护的线程池,是众多并发并行结构的底层线程池,如 CHM 的各种 TASK 、CompletableFuture 、parallelStream 等等。但是其依然有缺点,实现非常的复杂,它就是 JUC 最复杂的类(体系),而且每个版本都有大改动,行为在每个版本也不一样,负载均衡如此复杂却没带来高效,如果是 Java 8 则不建议使用,因为 ForkJoinPool 会创建和销毁大量的线程,commonPool 更加不推荐使用。而 Netty 线程池体系非常庞大,几十个类构成,实现了 Future/Promise 模型,EventLoop 绑定一个线程,每个 EventLoop 都有一个工作队列,并且通过轮询实现了任务提交的负载均衡( ForkJoinPool 是执行的负载均衡,思想更先进),Netty 的线程模型和线程池给人巨大的启发,线程并不需要太多,依然可以有极高的效率,Netty 5 就是打算使用 ForkJoinPool 取代其本身的线程池,但是最终效果并不好,此版本也废弃了(还有其他原因)。我目前知道 Netty 线程池唯一坑点就是 EventLoop 被关闭后不会重建,除了 NioEventLoop,其他的线程池都会被 execute 提交的 runnable 产生的 unchecked exceptions 关闭(大坑)。

  • 当时好奇 Mybatis ( JDBC )增删查改的发送和返回到底是什么,用抓包工具分析 MySQL 的包(对应 OkPacket ),做了大量的测试,发现了没有开启 rewriteBatchedStatements 的 addBatch 就是循环提交,发现了更新操作的 Affected Rows 和 Rows matched 的区别,也发现了自增 id 和 Last_INSERT_ID 、addBatch 返回 ids 等线程安全的原理,原来这些是基于 MySQL session/JDBC connection,相当于 ThreadLocal,当然没有线程安全的影响。

缺点

  • 经验和眼界不足,没有特大并发项目经验,只停留在各大技术博客分享的理论中。
  • 时间的限制,现在广度不足,对 MQ 、MySQL 、Redis 之类暂时停留在理论和使用上,主要在积累和总结经验,几乎没研究过源码。
  • 一般算法能力,曾经也疯狂刷过 LeetCode,比如处理线性表屡试不爽的滑动窗口法(双指针),可能觉得收益太低,所以把精力投在研究源码和业务学习上了,现在顶多手写快排。