VS2022 preview 体验

自己的电脑之前一直用VS2017,最近磁盘空间不太够了,打算把VS卸载了顺便安装到别的磁盘.于是乎就考虑安装VS2022,顺便可以体验下C#新语法和.NET 6.

至于VS2022的新特性,官网都有就不胶水了,在我看来比较好的一个是支持64bit,一个是结合了AI的智能提示的功能,以及WSL的集成.

Tips: Resharper还没有正式支持,但是有对应的preview版本使用

安装

没啥大变化,web,.net Core之类的成为默认的了,不像之前需要勾选cross platform,installer UI有些变化,里面嵌入了视频

体验

.net 6 WSL 支持

这个也算是跟上VS Code的remote server吧,不过有点BUG,安装一直是失败,目测是权限问题,切到WSL里面自己sudo安装下,路径就在home的dotnet_install下面

原理嘛,估计跟vscode那套差不多,都是远程启动个进程,共享些数据回来

AI IntelliCode

总体体验下来, 虽然有不少提示不正确, 不过总体还是可以的. 可能因为就是测试写算法题, 这些逻辑本来就有些绕, 如果是业务代码估计体验会好很多, 还有这个是离线使用的.

二分: 猜对了一半,这个很强,没有前面的上下文

拓扑排序: 好像猜对了,根据上下文猜的

KMP: 我都不知道我写的对不对,你能猜对?

下面两图可以看到AI已经认为我是个胶水程序员了

总结

海星

Leetcode 700题纪念

最近几年在这个上面花了可能有上千个小时了, 是一个值得纪念的里程碑。

起源

说来惭愧, 大学期间完全没有听过过OJ这个东西,直到毕业几年逛论坛才知道有这么个东西,从最初的想破脑袋也解不了,到现在的看到题目就有个基本思路。但是做这些题目有意义吗?实际工作会有这么的问题需要解决吗?工作中确实没有用到这些技能,不过对复杂问题的分解,对性能的追求,对简洁完善的代码的追求,对边界条件的处理等,这些每天都用得到的技能,是我最大的收获。

另外,最近看了些Redis的源码,里面花式操作链表非常熟悉,在LC上有不少相关的题目。

几年前一次偶然的机会,得到了一个神秘的代码挑战,google foobar invitation,激发了我对OJ的兴趣。 这个挑战一点都不简单,前面的2个问题我还能应付,后面的几个我当时参考了别人的答案, 一个是最大流算法,一个是Markov chain的问题,放到现在我有信心解这2个题目。

下一步

前面几年没有太多时间刷题,工作考证健身学习等花了我大部分的时间。 疫情期间在家办公,省去了通勤时间,且出门次数更少,使我有比较多的时间来刷题。最近一年有1500+次提交。后面我可能不会再这么频繁的提交了,要把时间花再其他方面了。比如最近很感兴趣的分布式系统。

这几个月开始参加LC contest,也从最开始的俩题,现在基本稳定在三个题目,有次还意外的全部AC,不过后面有个题目补了case,最后算没过。几次比赛下来,发现第四题都会牵涉到一些高级算法或者组合多个问题,比如状压DP,树状DP,各种图论如Tarjan/BF,数论等, 打算学习一些高级算法技巧, 争取后面能稳定4题。

语言

之前刷题主要是用C#, 框架里面少了2个高级数据结构有点无语,PriorityQueue, MultiSet,PQ内部就是个堆,可以自己手动撸个, MultiSet 这个可以用 SortedList<TKey,TValue> ,加二分来实现floor和cell功能。由于没接触过这俩数据结构带来解题思路上的缺失,使我意识到要BFS,开拓一下视野。

最近参与6.824课程,使用了golang做课程,发现golang里面一些设计有点意思。还写了一些Java代码,了解了一些JVM的东西,通过对比CLR有一些收获,后面考虑写一篇相关的。

Ctrl + c , Ctrl + v 如何工作

做为一个胶水程序员, Ctrl+C 和Ctrl+V是必备的技能之一.

从VS Code复制东西到word和VS复制到word, 怎么VS里面有些高亮的东西没了, 怎么掉色了? 复制到OneNote更是掉色的彻底, 字体高亮都没了,全是黑色字体了.

做为一个胶水程序员, Google是必备的技能之一.

以下为Windows上复制和粘贴的一些记录:

  1. Copy and paste本质上是IPC, 也就是是进程间通信, 比如前面的数据从VS到了Word
  2. 当然, 这个由操作系统调度, 内容在RAM中, 文件/目录的话应该是它的地址, Windows10云粘贴板的话数据要到云端了
  3. 粘贴板的内容有格式, 并且有多种格式并且复制时操作系统会生成多种格式的复制供粘贴选择, 比如从浏览器复制了一个带链接的文本, 到NotePad++里面就是纯文本,到OneNote里面就是带链接的
  4. 粘贴到target的内容的样式, 其实是类似”协商”的结果, target可以按照优先级选择要粘贴的格式

通过以上可以看到复制粘贴也是有些复杂的, 至少比想象的复杂的多..

测量

在玩<文明5>的时候, 了解到了一句来自大物理学家-伽利略·伽利莱(Galileo Galilei)的话:

Measure what is measurable, and make measurable what is not so

多么有雄心的话! 可以想象, 在他生活的时代有太多未解之谜, 在解开谜题的时候他发现很多东西没有办法用数字来表达.

到了现代, 地球上大部分东西都被研究到了, 几乎多有可见的东西可以从多个维度准确的表达:

声音: 音波,音色音速等
颜色: 光谱
物体: 硬度,密度,摩擦系数,外形等

不过还是有些无法准备测量,比如味觉,感情等比较主观的. 不过人们还是在想办法把他们从某个维度数值化, 比如网上一道菜的评分.

量纲

要使一个对象可以被测量, 得有量纲.

计算机世界

计算机世界的测量就简单的多了, 相对来说不像地球这么复杂. 在这个由0和1组成的世界中, 电子在各个元器件中流转, 通过电压表示1或者0. 从数据的角度, 人们发明了字节这个量纲, 表示一个对象的大小. 与物体移动类似, 数据也需要移动,于是有了带宽. 数据需要被CPU处理, CPU通过连续的脉冲信号触发逻辑运算, 于是有了时钟频率的单位.

代码世界

往上面去, 就到了代码的世界, 人们通常用世界空间复杂度来表示其效率, 如O(n^2)表示对于一个规模为100的问题, 需要100*100 次运算或者空间. 在健壮性方便, 可以通过UT的通过率表示.

系统世界

代码组成了系统, 系统根据其类似也有一些表示, 比如GUI相关的, 可以有帧数来测量是否流程, website通过TTFB表示服务器响应速度, QPS, TPS等表示系统处理请求的能力等.

(未完)

关于测试

测试类型

测试代码是我们的好朋友(测试人员也是). 它可以使我们写代码的时候更自信, 不必过分担心不小心影响到其他功能. 测试可以帮助我们.

一些常规开发过程中的:
1. End to end test
1. Integration test
1. Unit test

和一些发布后进行的:
1. Smoke/Sanity test
1. Regression test

以及一些性能测试.

测试什么

从后端程序员的视角来看, 日常开发更关注于Unit test和Integration test. 通过一些测试组件, 覆盖各种条件.

单元测试

单元测试主要测试代码片段, 通常是方法级别的测试, 测试各种条件的输入下, 方法可以得到意料之类的结果. 测试覆盖率应该尽可能的高, 边界条件要尽可能覆盖, 这是比较理想的情况..
写可以测试的代码, 代码逻辑混乱, 方法体过大, 参数过多都会让测试变得困难. 所以测试的另一个好处就是让代码结构合理一些, 因为这些代码要可以测试, 会自然而然的被”优化”.

所有的测试都可以被抽象为下面的模型.

3A:
1. Arrange , 安排起来.. // var testObject = new TestObject();
1. Act , 执行 // var result = testObject.MethodA();
1. Assert , 断言 // Assert.AreEqual(true, result);

集成测试

集中在测试后端接口, 构造一个client, 发起请求, 验证API的相应状态与结果, 以及一些中间数据的状态. 相对来说每个步骤都会复杂一些, 虽然也是上面的3A模型.

//var server = new TestServer();
//var client = server.CreateClient();

//var response = await client.GetAsync(“…”);

//Assert.AreEqual(200, response.StatusCode);
//Assert.AreEqual(“testContent”, response.Content)

对于不同版本的aspnet core版本, 实现方式略有不同, 不过方式都是为了创建In-Memory server, 然后访问接口了.

集成测试 aspnet core 1.1

可以使用TestServer class来实现,TEntryPointStartup后者子类. 定制不太方便, 最近再研究下怎么控制.

            _server = new TestServer(new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseStartup<TEntryPoint>());
            _client = _server.CreateClient(); //get client

集成测试 aspnet core 2.2+

MSDN有详细的文档, 不做胶水程序员了! 值得注意的是开放了WebApplicationFactory.ConfigureWebHost, 可以方便的定制services.

            _factory = new CustomWebApplicationFactory<Startup>();
            _factory.WithWebHostBuilder(builder =>
            {
                var mockMailService = A.Fake<IMailService>();
                A.CallTo(() => mockMailService.SendActivationEmail(A<User>.Ignored)).Returns(Task.CompletedTask);
                builder.ConfigureServices(services =>
                {
                    services.Replace(new ServiceDescriptor(typeof(IMailService), sp => mockMailService,
                        ServiceLifetime.Scoped));
                });
            });

            //...
            var client = _factory.CreateClient();