编程的疯狂

继承人有问题!

每个人都喜欢浪费典型工作日无休止的苦恼。 会议,同事打扰,设备不足,Reddit ..感觉时间已经到了,除了手头的任务。

但是,让我们暂时搁置所有这些。 您在您的区域中。 没有分散注意力或视线的干扰。 甚至没有Reddit。 我们花费大量时间不编写代码,而是在浏览器上寻找答案。 回答您不想问的问题。 最愚蠢的事情可能要花费数天才能解决,使您发疯,并使您考虑职业选择。 但是我们在找什么呢? 为什么在任何给定时间都有50个选项卡打开,其中有一半用于堆栈溢出?

我最近从头到尾编写了一个应用程序 ,我想回答这个问题。 该项目是开发人员的梦想,因为它完全是未开发的项目,只有一个人要怪(我),而我有一个非常具体的功能列表,它们不太可能更改或增加。 我完成了整个堆栈(Kotlin,Spring,Bootstrap和Angular)—从项目创建到将其部署到Docker容器中的云中的所有过程。 日历花费了大约两个月的时间,当我的新生儿允许它睡觉时,在这里和那里大概花了一两个小时。

从某种意义上说,堆栈是一个典型的堆栈,其中包含我非常熟悉的内容(Spring),对某些全新知识(例如Google Cloud和Spring Webflux)的知识有限(例如Kotlin,Angular,Bootstrap)。 为了纯粹的学术兴趣,我还添加了一些元素(JWT令牌,已公开)。

那么,时间会花在哪里呢? 基本上,所有编程任务都始于分而治之-设计总体架构,然后将问题分解为更易于管理的部分,并开始一一解决。 数据库。 UI视图。 REST请求处理。 身份验证。 CSS。 在上。 对于任何有经验的程序员而言,这种划分都感觉像是第二天性,而当您进入生活时,生活就好像值得生活。 然后来惊喜。 “我的紧急威士忌在哪里”的东西,会让你拔头发(我秃顶)。

不需要花两天时间就能解决的问题类型的事情会让您发疯。 例子不起作用。 构建突然失败。 配置选项似乎无效。 依赖项发布的补丁破坏了一切。 错误代码。

xkcd 1024

出于兴趣,我写下了我在途中遇到的最大的惊喜问题,这些问题花了两个多小时才得以解决,并使我更趋向疯狂的边缘。 其中许多可能是他们自己的帖子,并为在那里的下一个吮吸者节省了一些头发,但我将简要介绍其中的一些问题和解决方案。

使用Spring Boot的JWT令牌不起作用

那里有指令 ,但是会话数据并没有在Spring内部保留。 根据我的身份,无论我进行了多少身份验证,我始终都是匿名用户。 我花了最长的时间调试了Spring请求处理的内部,直到我想通了。 事实证明,使用@Autowire将Spring SecurityContext传递给类是一个坏主意。 每次使用SecurityContextHolder

经验教训 :如果您在使用库时遇到麻烦,并且很幸运可以使用所有代码,请查看代码。 凝视并调试足够长的时间,您可能会发现。

也许我应该尝试做汽车修理工?

如何从公开交易中返回数据?

公开的是Kotlin的ORM)。 在框架中,您将数据库操作包装到如下事务中:

transaction {
val dao = UserDao.find{ name eq someName }
dao.password = newPass
return toPojo(dao) // Error
}

我想从该事务中返回某些内容(带有更新数据的POJO),但是不允许return关键字。 我什至不知道该如何解决这个问题。

经验教训 :Kotlin高阶函数返回最后一条语句,而该事务只是带有lambda参数的方法。 所以最后一个例子就是:

transaction {
val dao = UserDao.find{ name eq someName }
dao.password = newPass
toPojo(dao)
}

由于某些莫名其妙的原因,我的大脑没有与Kotlin lambdas建立联系 ,我认为这是另一种魔术。 我真正需要做的就是查看事务功能的定义方式并对其进行适当的内部化。

没有魔术,只有您不了解的事物。 如果魔术失败了,您在使用前先停下来弄清楚。 疯狂地寻找解决您不了解的问题的解决方案将无济于事。

也许有酿造的机会?

Spring路由中的角路由错误

在Spring中,您可以使用WebSecurityConfigurerAdapter类声明安全规则,以解析每个URI的方式,从而可以绕过会话身份验证等。但是如果我在Angular中使用路由,即使用不同URI的不同控制器。 Spring变得很适合并且吐出了错误。

经验教训:事实证明您需要以下内容:

确保所有请求(与其他Spring路由规则不匹配)都转发到index.html ,并从那里转发到正确的Angular控制器。 Google将为您提供各种已过时的不再可用的版本。

也许是水管工?

Spring JUnit测试失败

我同时遇到两个问题,Spring Context加载无法按我想要的方式正常工作,并且自动装配字段很不稳定。 例如,上下文没有加载用YML编写的配置文件,尤其是在集成测试中。 而且,现场注入在测试上下文中不太有效。

经验教训:事实证明您不能在测试属性中使用YML (查看受支持的格式)。 如果可以避免的话,不要注入字段 。 更好的是,如果可以避免的话,请完全避免使用Spring。

垃圾人?

通过ConfigurationProperties进行配置

与上一个部分相关的ConfigurationProperties虽然很酷,但工作起来却非常痛苦。 再次说明,魔术系数过高-通常,已定义的配置POJO只是说空,而我不知道该怎么做。 他们不在单元测试中工作也没有帮助。

经验教训:有时无休止的修补是您所能做的。

蒸馏怎么样?

公开的多表查询

再次暴露出困境。 我不知道如何编写涉及多个表的查询。 最后,我问了Stack Overflow并得到了答案。

经验教训:生成SQL查询的DAO框架魔术在设计上是失败的。 我什至在开始之前就感觉像这样,而我又来了。 也许这一次他们会工作,我对自己说。 不。 您的脑海中有一个干净,快速的SQL查询,但是您要花大量时间不断地按摩DAO层,希望它能够正确生成它并且不会太慢。 像Android Room这样的东西简直就是上乘。

酿酒吗?

业力拒绝与PhantomJS合作

如果我针对PhantomJS浏览器引擎运行,则单元测试将失败。 我会得到类似[object ErrorEvent]东西,并且测试会随机失败。

经验教训: JavaScript生态系统是一团糟。 但是我已经知道了。

我想知道您是否甚至可以通过窗户扔一个新的纯平屏幕,还是会弹跳

有组织犯罪如何?

Hoek中的安全漏洞

我不知道Hoek是什么,但是Github抱怨说它存在一个漏洞,所以我花了数小时来弄清楚如何修复它。 该问题已解决,但我不相信已解决。

经验教训: JavaScript是一团糟。 依赖项中的安全性问题始终也是您的问题。

活在桥下,过着社会保障?

角度5-> 6

在开发过程中,发布了Angular 6。 我以无限的智慧认为升级应该轻而易举,我只有几百行Angular代码,对吗? 我还以为我会咬牙切齿,因为代码库很小,所以不使用兼容性层。 我运行了自动升级,遇到了……问题。 以下是清单:

  • 我大量使用了Observable.of和Rx流运算符,但都没有正确升级。 特别是stream pipe()的更改很痛苦。
  • 进口物摆弄着。 我认为他们只是在和我们搞混。 他们知道这会破坏一切,对吧?
  • WebStorm失去了运行测试的能力

经验教训在使用最新和最好的软件时,请格外小心。 如果我只是等待事情解决,也许所有这些都可以避免。

农业?

TypeScript编译错误

突然,Angular一侧的所有组件都崩溃了。 我有:

ERROR in src/app/auth.interceptor.ts(6,2): error TS2345: Argument of type 'typeof AuthInterceptor' is not assignable to parameter of type '({ providedIn: Type<any> | "root"; } & ValueSansProvider)
| ({ providedIn: Type<any> | "root"; } ...'.
Type 'typeof AuthInterceptor' is not assignable to type '{ providedIn: Type<any> | "root"; } & ClassSansProvider'.
Type 'typeof AuthInterceptor' is not assignable to type '{ providedIn: Type<any> | "root"; }'.
Property 'providedIn' is missing in type 'typeof AuthInterceptor'.

Google没有提供任何帮助。 是的,该错误位于auth.interceptor.ts中的第6行,但我没有看到它。 我重写了该类,并比较了结果以找出错误。 我错过了@Injectable批注中的括号。

经验教训:休息后,我立即看到了错误。 检查“ Hello World!”时的基本知识 级别的东西不起作用。

流浪汉?

Kotlin中的Json列表类型

将JSON列表映射到Kotlin Pojos时遇到麻烦。 基本上是这个问题 。 虽然我确实弄清楚了,但它看起来如此丑陋而片状,我选择了计划B,而只是更改了JSON。

经验教训:解决方法始终是一种选择。

公园护林员?

Gradle 4的Spring集成测试

我没有做Spring Integration测试的运气,我得到的只是:

java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing

我到处看的一切都还停留在Gradle 3上,没有任何帮助。

获得的经验:您随时可以打开更多搜索选项卡。 无休止的谷歌搜索使我了解正确的魔术:

configurations {
integrationTestImplementation.extendsFrom testImplementation
integrationTestRuntimeOnly.extendsFrom testRuntimeOnly
}

它仍然是魔术。 我什至不知道该读些什么使它变得不可思议。

职业高尔夫球手? 在37岁时仍然可以选择对吧?

我的Rest控制器返回HTML

我的其余端点之一固执地返回了HTML而不是JSON。 我费力地浏览了注释,无法理解发生了什么。 我添加了各种接受和返回类型注释,但没有任何效果。

我错过了使用@Controller而不是正确的@RestController进行注释的类。 叹。

经验教训:再次有了基础。

施工? 我听说他们有需求。

如果用户没有访问权限,如何返回403

Spring有一个名为UserDetailsS​​ervice的接口,可用于定义例如如何从数据库中加载用户。 但是我无法弄清楚如何将身份验证与授权区分开,即用户是已知的,但在所述页面中是不允许的。 我无处可去 。 我在前端端破解了一个解决方案。

经验教训:失败总是一个选择。

保姆 哦,等等,我已经这样做了。

电脑崩溃

我的旧Surface Pro 3开始承受压力,所以我买了一台新电脑 。 我的单元测试执行时间从15秒变为2。不再冻结IntelliJ。 我可以在Docker容器中同时运行WebStorm,IDEA和该应用程序,但仍然有可用的内存。

经验教训:解决金钱问题总是一个好主意,前提是您有钱。

敦促杀死衰落。
角路径参数

我需要在控制器之间发送参数。 当然,那里有向导 ,但魔术系数又太高了。 感觉好像偏离了示例一毫米,突然, route.params空了。 对于业力测试,这是双重事实。 为什么现在不需要此RouterTestingModule,为什么呢? 特别是如何为控制器设置参数似乎有很大的不同。 我终于解决了类似这样的问题,将参数传递给控制器​​:

TestBed. configureTestingModule ({
declarations: [GroupComponent],
imports: [FormsModule, RouterTestingModule. withRoutes ([]), HttpClientTestingModule],
providers: [GroupsService, UserService, AlertService, AuthenticationService,
[GroupComponent, {
provide: ActivatedRoute,
useValue: {snapshot: {params: {'group': '123'}}}

}]]
}). compileComponents ();

这项测试通过每项测试后,您可能会感到非常难看,但是,它确实有效。

获得的经验:再次具有魔力。 有限的文档流血的边缘魔术。

还有更多,但我想您明白了。

我希望我是杰克

From: https://hackernoon.com/the-madness-that-is-programming-cba8794f0995

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值