There's a remote team of 6 developers in 4 different countries. It uses CI, version control, Slack and has a weekly status call. They do code reviews on each pull request (always same reviewer). However there are no formal rules on code organization, style and layout. Some of the team members work part-time, so a daily standup is not an option.
Knowledge about features being developed is 'siloed' - each developer is generally aware about an isolated part of the codebase he's working on. Tasks are defined in an issue tracker and team discusses what each developer does on the weekly call. However, the features are complex in nature and it's hard to really understand what's going on without looking at code. As a result, the team found that some functionality is duplicated 3-4 times. Since different developers have different coding styles (e.g. how much inheritance depth is ok, line length and so on), some features are hard to maintain and codebase evolution is being pulled in orthogonal directions.
What are some specific procedures this team can implement, so that there's a shared understanding of the codebase and architecture?