Вопросы накопившиеся за год по разработке в области программирования

У меня есть несколько вопросов по поводу программирования в целом:

  1. Я за все свое обучение программированию пока не понимаю откуда человек знает, какую версию взять той или иной библиотеки. Ну например, подключил я log4j и allure-junit-adaptor и прописал необходимые зависимости. Но возникает конфликт при запуске теста с версией allure 1.4.4, и в логе появляются море ошибок

POM:

<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>
  <groupId>org.autoadmin.sl</groupId>
  <artifactId>SL_AutoFrame</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <name>SL_Frame</name>  
  	  	<properties>
  <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
  <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
  <aspectj.version>1.8.4</aspectj.version>
    <allure.version>1.4.4</allure.version>
  </properties>
  <profiles>
  <profile>
  <id>a</id>
   <properties>    
  	<login>admin</login>
  	<password>admin</password>
  	 <include.tests>**/TestKaraoke.java</include.tests>   	 
   </properties>
  <activation>
    <activeByDefault>true</activeByDefault>
   </activation>
  </profile>
    <profile>
        <id>BasicTest</id>
        <properties>
         <include.tests>**/TariffPlan.java</include.tests>   
        <testcase.groups>com.sl.cat.SlowTest</testcase.groups>
        
        </properties>
    </profile>
      </profiles>
  <build>
    <plugins>
      <plugin>
        <artifactId>maven-compiler-plugin</artifactId>
        <version>3.1</version>
        <configuration>
          <source>1.8</source>
          <target>1.8</target>
           <encoding>${project.build.sourceEncoding}</encoding>
        </configuration>
      </plugin>
      <plugin>
      <groupId>org.apache.maven.plugins</groupId>
  		<artifactId>maven-surefire-plugin</artifactId>
  		<version>2.18</version>
  		
  		<configuration>
  		<testFailureIgnore>false</testFailureIgnore>
        <argLine>
			-javaagent:${settings.localRepository}/org/aspectj/aspectjweaver/${aspectj.version}/aspectjweaver-${aspectj.version}.jar
		</argLine> 
		<properties>
			<property>			
				<name>listener</name>
				<value>ru.yandex.qatools.allure.junit.AllureRunListener</value>
			</property>
		</properties>		
        </configuration>
          <dependencies>  		
        <dependency>
  	  		<groupId>org.aspectj</groupId>
  	  		<artifactId>aspectjweaver</artifactId>
  	  		<version>${aspectj.version}</version>
  	  	</dependency>
    </dependencies>
      </plugin>
      
    <!-- <plugin>
	<groupId>org.mortbay.jetty</groupId>
	<artifactId>jetty-maven-plugin</artifactId>
	<configuration>
		<webAppSourceDirectory>d:/qwerty/site/allure-maven-plugin</webAppSourceDirectory>
	</configuration>
</plugin>-->
     
    </plugins>
  </build>
  <dependencies>
  <dependency>
  <groupId>ru.yandex.qatools.allure</groupId>
  		<artifactId>allure-junit-adaptor</artifactId>
  		<version>${allure.version}</version>
  </dependency>
  <dependency>
  		<groupId>org.hibernate</groupId>
  		<artifactId>hibernate-core</artifactId>
  		<version>4.3.7.Final</version>
  	</dependency>
  	<dependency>
  		<groupId>org.mariadb.jdbc</groupId>
  		<artifactId>mariadb-java-client</artifactId>
  		<version>1.1.7</version>
  		</dependency>
    	<dependency>
  		<groupId>junit</groupId>
  		<artifactId>junit</artifactId>
  		<version>4.12</version>
  	</dependency>
  	<dependency>
  		<groupId>org.seleniumhq.selenium</groupId>
  		<artifactId>selenium-java</artifactId>
  		<version>2.44.0</version>
  	</dependency>
  	 <dependency>
  		<groupId>de.huxhorn.lilith</groupId>
  		<artifactId>de.huxhorn.lilith</artifactId>
  		<version>0.9.44</version>
  	</dependency>
  	  	<dependency>
  		<groupId>org.slf4j</groupId>
  		<artifactId>jul-to-slf4j</artifactId>
  		<version>1.7.7</version>
  	</dependency>
  	<dependency>
  		<groupId>ch.qos.logback</groupId>
  		<artifactId>logback-core</artifactId>
  		<version>1.1.2</version>
  	</dependency>
  
  	  	<dependency>
  		<groupId>uk.org.lidalia</groupId>
  		<artifactId>sysout-over-slf4j</artifactId>
  		<version>1.0.2</version>
  	</dependency>
  	  	<dependency>
  	  		<groupId>ru.stqa.selenium</groupId>
  	  		<artifactId>webdriver-factory</artifactId>
  	  		<version>1.1.43</version>
  	  		 <exclusions>
        <exclusion>
          <groupId>org.testng</groupId>
          <artifactId>testng</artifactId>
        </exclusion>
    </exclusions>
  	  	</dependency>
  	  	<dependency>
  	  		<groupId>xml-apis</groupId>
  	  		<artifactId>xml-apis</artifactId>
  	  		<version>1.4.01</version>
  	  	</dependency>
   	</dependencies>
  <reporting>
	<excludeDefaults>true</excludeDefaults>
	<plugins>
		<plugin>
			<groupId>ru.yandex.qatools.allure</groupId>
			<artifactId>allure-maven-plugin</artifactId>
			<version>2.0</version>
			<configuration>
                    <resultsPattern>**/allure-results</resultsPattern>
                </configuration>
		</plugin>
	</plugins>
</reporting>
</project>
  1. И одно дело когда это мой проект и я могу методом проб и ошибок сам определить в чем причина (в чужом коде я путаюсь, поэтому лог не могу так с легкостью разобрать). А что делать когда в чужой компании сталкиваешься с подобными ошибками. Как понять что это именно из-за версии, только по логу? Но тогда как начать понимать с легкостью и читать чужой код?
  2. Например я использую Eclipse, но люди которые раньше пользовались блокнотом (если вообще писали), как узнавали что он определил все взаимосвязи правильно и у них не возникнет ошибок?
  3. Сейчас существуют просто море библиотек, как программисты узнают, что сейчас актуально, а что нет. Что пригодится в следующей компании, а что нет?
  4. В зависимостях у log4j есть куча сторонних groupID, я так понял что это разработчики которые не связаны с данной библиотекой. Тогда почему их используют если можно взять просто официальный log4j?
  5. Что означают все возможные -classic - core - adapter при выборе зависимости

За целый год я изучил много, но многое остается не понятным и конца изучения в программировании я пока не вижу. Я очень попрошу отвечать подробнее и без шуток, так как эта тема для меня лично очень важна.

Поменяйте заголовок, на самом деле вопросы не про программирование.

По скольку я не джава дев, то отвечу на 3 и 4

3.Использую vim без плагинов и надстроек чтоб кодить… хоть и компилю вижуал студией, всё впадлу мейкфайлы выучить. На самом деле так изучается архитектура проэкта значительно быстрее. Вы запоминаете, потому что вам приходится. У вас нету ителисенса (выпадающего меню с предполагаемыми способами окончить команду), нету быстрых переходов на функцию, по-этому приходится всё держать в памяти. Когда учил программирование, самое успешное обучение было тогда, когда программу на бумаге пишешь и не забиваешь в комп, пока не будешь полностью уверен, что она выполнится и выполнится правильно. Правильный компилятор всегда поможет найти место ошибки, если та вдруг появилась
4.Никак, что начал использовать, то и продолжаешь. Дело архитектора выбрать на начальном этапе наиболее подходящуюю, удобную и надежную. Все остальные просто должны будут её юзать. Придете на другой проэкт, там будет совершенно другое решение, будете учиться по новой. Компания период вашего обучения всегда учитывает, когда вы к ним на работу приходите… ну если компания адекватная.

Спасибо, что прояснили некоторые вещи.

Тема далека от программирования. И ооочень java-миро-ориентированная.

  1. Диагностика - http://maven.apache.org/plugins/maven-dependency-plugin/examples/resolving-conflicts-using-the-dependency-tree.html
    Подключают обычно “последнюю стабильную”. Проблемы класс-паса есть разные механизмы резолвинга.
    Dependency management, отдельная боль на которую нет серебрянной пули. Имхо хардкорные вещи: OSGi, classLoader.

  2. Читайте больше чужого кода и архитекурных книг, когда ясны “шаблоны”, код открывает свои секреты. У меня навык сильно прокачался, когда: освоил несколько языков и типичных подходов, а также когда на проекте стало эффективным вычитывать код и юнит тесты разработчиков.
    Читайте тесты чужих библиотек, если они есть то это другой ключ к коду. Начните прямо с этого

  3. Когда можно компилятор поможет, если а ля “Method not found”, более сложные вещи - тесты, тесты. тесты.

Рекомендую книги практики continuous integration / continuous delivery.
Когда-то меня поразило это

  1. Комьюнити, новостные ленты и т.п. Взял попробовал, понравилась - адоптишь… При неком навыке, на маленькие библиотечки хватает 30 минут.

  2. Не понял вопроса. Но возможно я не в теме.

  3. Тут нет универсального ответа, или я не понял вопроса. Приблизительно core - минимальный набор зависимостей. classic/main/all то что используют все “как правило”. adapter/adaptor - прям из названия, паттерн по “приспасабливанию” одного под другое - переходник. Примеры: приспособить ивенты log4j под slf4j или наоборот, приспособить юнит тесты питона, под джавовский репорт-генератор.
    Эти штуки нужны:

  • не грузить того что не нужно => performance, less memory
  • более понятное дерево зависимостей, без избытка библиотек

P.S. Что то за год мало вопросов :wink: